Artigo: 924947 - Última revisão: terça-feira, 20 de Novembro de 2007 - Revisão: 2.5

SQL Server aumenta significativamente o espaço não utilizado para algumas tabelas

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.

Nesta página

Expandir tudo | Reduzir tudo

Sumário

Este artigo descreve um cenário em que o Microsoft SQL Server aumenta significativamente o espaço não utilizado para algumas tabelas. Em seguida, o artigo descreve os seguintes dois métodos que pode utilizar para contornar este problema:
  • Converta tabelas de pilha para tabelas que utilizam índices agrupados.
  • Defina a opção de configuração abrir objectos para um valor elevado.

Sintomas

Considere o seguinte cenário no SQL Server:
  • Uma instância do SQL Server tem uma ou mais utilizador bases de dados.
  • O número cumulativo de tabelas destas bases de dados é maior do que o limiar específico listados na tabela no final desta secção. Estas tabelas incluem a tabela de sistema, a tabela de utilizador e a tabela temporária.
  • As aplicações que estão ligadas à instância do SQL Server a maior parte destas tabelas de referência.
Neste cenário, poderá detectar os seguintes sintomas:
  • Aumenta o espaço que consomem estas bases de dados do utilizador a uma velocidade é muito mais rápida do que a taxa normal. Consoante as definições Autogrowth para estas bases de dados do utilizador, os ficheiros de base de dados podem aumentar até mais frequentemente que crescem casos normal.
  • A parte não utilizada o espaço que consomem estas bases de dados do utilizador será maior do que a parte não utilizada normal.
  • Quando visualiza as propriedades das estruturas de armazenamento para estas bases de dados utilizador, tais como a estrutura de armazenamento de pilha, a árvore de imagem de texto e o índice clusterizado, verá muito espaço não utilizado.
  • O espaço reservado para as entradas de índice na tabela de sysindexes aumenta em múltiplos de 8. No entanto, o espaço utilizado para as entradas de índice na tabela de sysindexes aumenta apenas um pequeno número, tal como 1 ou 2. Isto é, para cada oito páginas que estão atribuídas de uma nova extensão, apenas algumas páginas são nunca utilizadas a partir dessa extensão.
O limiar abordada neste artigo varia, consoante as seguintes condições:
  • A edição específica do SQL Server que está a utilizar
  • A memória que configurou para SQL Server
A tabela seguinte lista estes limites para diferentes edições do SQL Server.
Reduzir esta tabelaExpandir esta tabela
edição memória (bytes) limiar
Empresa/P/DeveloperMais 671,088,6408192
Empresa/P/DeveloperMenor que 671,088,6402048
Empresa/P/DeveloperMenor que 67,108,864512
Empresa/P/DeveloperMenor que 8,388,608128
Pessoal/MSDENão aplicável128
A memória corresponde à definição memória do servidor máximo para a instância do SQL Server que está a utilizar. Pode utilizar o procedimento armazenado do sistema de sp_configure para configurar a definição de memória do servidor máximo .

Nota No SQL Server 2005, pode consultar a vista de catálogo sys.dm_db_partition_stats para obter as informações de espaço utilizado e as informações reservadas. No SQL Server 2000, pode consultar a tabela sysindexes para obter estas informações.

Causa

SQL Server mantém dois tipos de informações em cache para atribuição de espaço na memória: atribuição de cache e cache de espaço livre. A cache de atribuição contém o ID de extensão para extensões recentemente atribuídas para um índice específico. A cache de espaço livre contém números de página para páginas recentemente atribuídos de estes atribuído extensões. Também contenha o estado das páginas. Se estes caches ficar vazias, os problemas que são descritos na secção "Sintomas" ocorrem.

Estes caches ficar vazias pelas seguintes razões:
  • Executar comandos diferentes que tem de executar sincronizações entre as informações de metadados na memória e as informações no disco. Por exemplo, execute um dos seguintes comandos:
    • DBCC UPDATEUSAGE
    • ACTUALIZAÇÃO DE ESTATÍSTICAS
  • Os descritores objecto configuradas utilizando a opção abrir objectos são utilizados. Por conseguinte, não descritores livres estão disponíveis.

Como contornar

Para contornar este problema, utilize um dos seguintes métodos:
  • Converta tabelas de pilha para tabelas que utilizam índices agrupados.
  • Defina a opção de configuração abrir objectos para um valor elevado.
Estes métodos podem reduzir a taxa de crescimento para o espaço utilizado é atribuído a uma tabela. As seguintes secções descrevem estes dois métodos. As secções também descrevem porque é que estes métodos ajudarem a resolver o problema descrito neste artigo.

Converter tabelas de pilha a tabelas que utilizam índices agrupados

Nota Depois de converter as tabelas de pilha a tabelas que utilizam índices agrupados, pode efectuar as operações de manutenção do índice periodicamente para recuperar qualquer espaço não utilizado desnecessariamente. Por exemplo, pode executar os seguintes comandos:
DBCC DBREINDEX
DBCC INDEXDEFRAG 
segue é uma sequência típica das operações que ocorrem quando insere um registo numa tabela pilha:
  • 1. tente inserir uma linha na tabela.
  • 2. consulte a cache de espaço livre para o índice de id 0 desta tabela.
  • 3. determine se as páginas válidas presentes na cache de espaço livre.
  • 4. se Sim:
    • 4.1. se não existir espaço suficiente na página, inserir dados na página.
  • 5. se não:
    • 5.1. SQL Server tem de atribuir uma nova página para esta linha.
    • 5.2. consulte a cache de atribuição de id de índice 0 desta tabela.
    • 5.3. determine se extensões válidas estão presentes na cache de atribuição.
    • 5.4. se Sim:
      • 5.4.1. determine se qualquer uma das oito páginas na extensão pode ser utilizado para este novo pedido de atribuição de página.
      • 5.4.2. se Sim:
        • 5.4.2.1. alocar uma página de este já atribuído extensão.
        • 5.4.2.2. vá para o passo 5.5.5.
      • 5.4.3. se não:
        • 5.4.3.1. vá para o passo 5.5.1.
    • 5,5. se não:
      • 5.5.1. utilize os dados a partir do mapa de atribuição global (GAM) e o mapa de atribuição global (SGAM) secundário para localizar uma nova extensão a ser atribuído.
      • 5.5.2. atribuir uma extensão de nova.
      • 5.5.3. utilize uma página desta nova extensão para satisfazer o pedido de atribuição página nova a partir do passo 5.1.
      • 5.5.4. preencha as informações sobre esta extensão recém-alocado na cache de atribuição.
      • 5.5.5. preencher as informações sobre este recentemente atribuir a página na cache de espaço livre.
Se a cache de atribuição e a cache de espaço vazios entre operações de inserção posteriores, o SQL Server atribuirá novas páginas de extensões de novas para que as operações de inserção podem ter êxito. Quando os metadados da tabela é removido da memória, a cache de atribuição e a cache de espaço livre também são removidos. Deste modo, da próxima vez que efectua uma operação de inserção que referencia a tabela, estes caches estarão vazias. Nesta situação, SQL Server tem de efectuar o passo 5 e, em seguida, passo 5.5. Este comportamento faz com que as extensões recentemente atribuídas mostrar que oito páginas são atribuídas quando é utilizada apenas uma página. Um cenário do pior, poderá ser desperdiçados 56 kilobytes (KB) de espaço para cada operação de inserção que efectua na tabela.

Segue-se a sequência das operações que ocorrem quando inserir dados numa tabela que tenha um índice agrupado normal.
  • 1. tente inserir uma linha na tabela.
  • 2. atravessar a árvore de B para localizar a página de dados na qual do SQL Server deve armazenar a chave clustering.
  • 3. determine se existe espaço suficiente na página da nova linha.
  • 4. se Sim:
    • 4.1. inserir dados nesta página.
  • 5. se não:
    • 5.1. SQL Server tem de atribuir uma nova página para esta linha.
    • 5.2. consulte a cache de atribuição de id de índice 1 desta tabela.
    • 5.3. determine se extensões válidas estão presentes na cache de atribuição.
    • 5.4. se Sim:
      • 5.4.1. determina se é possível utilizar qualquer uma das oito páginas na extensão para este novo pedido de atribuição de página.
      • 5.4.2. se Sim:
        • 5.4.2.1. alocar uma página de este já atribuído extensão.
      • 5.4.3. se não:
        • 5.4.3.1. vá para o passo 5.5.1.
    • 5,5. se não:
      • 5.5.1. utilize os dados da GAM e SGAM para encontrar uma nova extensão a ser atribuído.
      • 5.5.2. atribuir uma extensão de nova.
      • 5.5.3. utilize uma página desta extensão para satisfazer o pedido de atribuição página nova a partir do passo 5.1.
      • 5.5.4. preencha as informações sobre esta extensão recém-alocado na cache de atribuição.
Se a cache de atribuição e a cache de espaço livre são limpos por motivos são descritos na secção "Causa", não é necessário imediato para atribuir uma nova página entre operações de inserção posteriores para esta tabela. Isto acontece, desde que os dados inseridos caibam na página existente onde a chave de cluster específica fisicamente tem de residir. Quando a página de dados fica cheia e se as caches estão vazias, SQL Server deve efectuar o passo 5 e, em seguida, passo 5.5. Como indica neste artigo, se utilizar um índice agrupado, o cenário em que são atribuídas novas páginas ocorre com muito menos frequência do que o cenário onde um registo é inserido numa tabela da pilha.

Seguem-se dois casos em que o problema ocorrer e a cache de atribuição e a cache de espaço livre estão vazias. Pressupõe-se que permite que de esquema a tabela para 100 linhas caber na página de dados.
  • Se a tabela tiver apenas uma estrutura de armazenamento de pilha, SQL Server pode atribuir uma extensão de nova para cada operação de inserção e utilize apenas uma página nessa extensão.
  • Se a tabela tem um índice agrupado, SQL Server pode atribuir uma nova extensão para todas as operações de 100 inserção e utilize apenas uma página nessa extensão.

Definir objectos abertos opção de configuração para um valor elevado

Este problema ocorre principalmente porque o SQL Server utiliza todas as ranhuras na área de memória designado com base na opção abrir objectos . Quando detecta o problema descrito neste artigo, pode definir o valor desta opção para acomodar quase todas as tabelas que vão ser referenciadas na instância específica do SQL Server.

Para determinar um valor de opção de abrir objectos impedirá que este problema, siga estes passos:
  1. Determine o número total de tabelas que estão presentes na instância específica do SQL Server.

    Nota As tabelas incluem tabelas de utilizador e tabelas de sistema. Tem de incluir tabelas de bases de dados do sistema.
  2. Calcular um tamanho de memória intermédia que fornece espaço para as tabelas temporárias e worktables consultas diferentes e as aplicações podem utilizar.
  3. Adicione o número de tabelas de utilizador e tabelas de sistema para a memória intermédia para determinar o número total de tabelas que pode ser acedido nesta instância do SQL Server. Este número total é o valor que deve ser definido para a opção de configuração abrir objectos .
Uma vez que o consumo de memória que é pré-atribuído durante o SQL Server arranque é com base neste valor, não tem de definir a opção de configuração abrir objectos para um valor muito elevado. Se definir a opção abrir objectos para um valor muito elevado, memória que foi originalmente utilizada para outros fins, como, por exemplo, para execução da consulta e de memórias intermédias de dados, é utilizada para manter os metadados da tabela na área de memória para a opção abrir objectos .

Não recomendamos que altere a configuração de objectos abertos em circunstâncias normais. Altere este valor apenas se tiver a certeza de que tenham o problema descrito neste artigo.

Ponto Da Situação

A Microsoft confirmou que este é um problema nos produtos da Microsoft listados na secção "Aplica-se a".

Mais Informação

Porque é que as definições de opção objectos abertos provocar este problema

Sempre que uma consulta referencia um objecto específico (tabela), o SQL Server carrega informações sobre o objecto na memória. Todos os metadados do índice tem referências para as informações de objecto do SQL Server foi carregado na memória. As caches de atribuição que são discutidas neste artigo estão associadas um índice específico. A opção abrir objectos controla o número de descritores de que a instância do SQL Server pode carregar na memória.

Quando o SQL Server é iniciado, SQL Server atribui um conjunto específico de ranhuras ou descritores , mantenha a versão de memória dos metadados de objecto. O número de ranhuras atribuídos depende da edição do SQL Server e a memória que esteja configurado para o SQL Server, conforme descrito na secção ? Sintomas ?. Todas estas ranhuras originalmente fazem parte de uma lista de livres. Um algoritmo específico é utilizado para atribuir ranhuras da lista de livres para os metadados do objecto. O algoritmo tem os seguintes dois modos de operação.

Modo 1

Depois do SQL Server ser iniciado, utiliza dos descritores de memória da lista de livres sempre que um novo objecto é referenciado. SQL Server continua a utilizar todas as ranhuras existentes quando carrega metadados sobre um objecto que é referenciado numa consulta. Uma vez que ainda existem entradas de ranhura na lista de livres, SQL Server continua a utilizar estes ranhuras. Para ranhuras existentes, SQL Server não reutilizar memória que foi utilizada por outro objecto.

Modo 2

Se um objecto está a ser recentemente referenciado numa consulta e a lista de livres tornou-se vazio, SQL Server verifica a lista existente de todos os objectos para determinar se existe uma ranhura podem ser removidos cujo metadados de objecto de memória. SQL Server tem de manter os metadados do objecto na ranhura apenas enquanto uma consulta referencia a tabela. Quando essa consulta estiver concluída, SQL Server pode reutilizar a ranhura se uma nova consulta faz referência a uma tabela diferente.

Quando os metadados de objecto é removido da memória, também será removido todos os respectivos metadados do índice associado. Quando este comportamento ocorre, o SQL Server também perde a cache de atribuição e a cache de espaço livre. Em seguida, quando uma consulta diferente referencia novamente esta tabela, todas as caches de atribuição estão vazias. Por conseguinte, da próxima vez que o SQL Server tenta atribuir uma página, SQL Server tenta atribuir uma nova extensão.

Se continuar do SQL Server recuperar ranhuras que contenham metadados objecto até que o SQL Server não é possível recuperar quaisquer ranhuras, SQL Server aumenta o tamanho da lista de livres.

Referências

Para obter mais informações sobre como utilizar o procedimento armazenado sp_configure para alterar opções de configuração, visite o seguinte Web site da Microsoft Developer Network (MSDN):
http://msdn2.microsoft.com/en-us/library/ms188787.aspx (http://msdn2.microsoft.com/en-us/library/ms188787.aspx)
Para mais informações sobre a opção abrir objectos , visite o seguinte site da Web MSDN:
http://msdn2.microsoft.com/en-us/library/aa196701(SQL.80).aspx (http://msdn2.microsoft.com/en-us/library/aa196701(SQL.80).aspx)
Para obter mais informações sobre a opção de configuração de memória do servidor máximo , visite o seguinte site da Web MSDN:
http://msdn2.microsoft.com/en-us/library/ms180797.aspx (http://msdn2.microsoft.com/en-us/library/ms180797.aspx)
Para mais informações sobre a arquitectura de tabela e o índice no SQL Server, visite o seguinte site da Web MSDN:
http://msdn2.microsoft.com/en-us/library/ms208356.aspx (http://msdn2.microsoft.com/en-us/library/ms208356.aspx)

A informação contida neste artigo aplica-se a:
  • Microsoft SQL Server 2005 Developer Edition
  • Microsoft SQL 2005 Server Enterprise
  • Microsoft SQL Server 2005 Express Edition
  • Microsoft SQL Server 2005 Standard Edition
  • Microsoft SQL 2005 Server Workgroup
  • Microsoft SQL Server 2005 Enterprise X64 Edition
  • Microsoft SQL Server 2005 Standard X64 Edition
  • Microsoft SQL Server 2005 Enterprise Edition for Itanium Based Systems
  • Microsoft SQL Server 2005 Standard Edition for Itanium Based Systems
  • Microsoft SQL Server 2000 Developer Edition
  • Microsoft SQL Server 2000 Enterprise Edition
  • Microsoft SQL Server 2000 Personal Edition
  • Microsoft SQL Server 2000 Standard Edition
  • Microsoft SQL Server 2000 Workgroup Edition
Palavras-chave: 
kbmt kbexpertiseadvanced kbtshoot kbsql2005engine kbprb KB924947 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 924947  (http://support.microsoft.com/kb/924947/en-us/ )