ID do 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 | Recolher tudo

Sumário

Este artigo descreve um cenário no qual o Microsoft SQL Server aumenta significativamente o espaço não utilizado para algumas tabelas. Em seguida, o artigo descreve dois métodos a seguir que você pode usar para solucionar esse problema:
  • Converta tabelas de heap em tabelas que usam os índices em cluster.
  • Defina a opção de configuração Abrir objetos como um valor alto.

Sintomas

Considere o cenário a seguir no SQL Server:
  • Uma instância do SQL Server possui um ou mais bancos de dados do usuário.
  • O número cumulativo de tabelas nesses bancos de dados é maior do que o limite específico que está listado na tabela no final desta seção. Essas tabelas incluem a tabela de sistema, a tabela de usuário e a tabela temporária.
  • Aplicativos que estão conectados à instância do SQL Server fazer referência a maioria dessas tabelas.
Nesse cenário, você pode observar os seguintes sintomas:
  • O espaço que esses bancos de dados usuário consumam cresce a uma taxa que é muito mais rápida que a taxa típica. Dependendo das configurações de Autogrowth para esses bancos de dados usuário, os arquivos de banco de dados podem crescer com mais freqüência que eles crescem em casos comuns.
  • A parte não utilizada do espaço que consumam esses bancos de dados usuário será maior do que a parte não usada típica.
  • Quando você exibir as propriedades das estruturas de armazenamento para esses bancos de dados usuário, como a estrutura de armazenamento do heap, árvore de imagem de texto e o índice de cluster, você verá muita espaço não utilizado.
  • O espaço reservado para entradas de índice da tabela sysindexes aumenta em múltiplos de 8. No entanto, o espaço usado para entradas de índice da tabela sysindexes aumenta apenas um pequeno número, como 1 ou 2. Ou seja, para todos os oito páginas que são alocadas em uma nova extensão, apenas algumas páginas já são usadas dessa extensão.
O limite é discutido anteriormente neste artigo varia, dependendo as seguintes condições:
  • A edição específica do SQL Server que você está usando
  • A memória que você configurou para o SQL Server
A tabela a seguir lista esses limites para diferentes edições do SQL Server.
Recolher esta tabelaExpandir esta tabela
edição memória (bytes) limite
Enterprise, Standard/DeveloperMais de 671,088,6408192
Enterprise, Standard/DeveloperMenor que 671,088,6402048
Enterprise, Standard/DeveloperMenor que 67,108,864512
Enterprise, Standard/DeveloperMenor que 8,388,608128
Pessoal/MSDENão aplicável128
A memória corresponde à configuração de memória máxima do servidor para a instância do SQL Server que você está usando. Você pode usar o procedimento armazenado do sistema sp_configure para configurar a memória máxima do servidor .

Observação No SQL Server 2005, você pode consultar a exibição 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, você pode consultar a tabela sysindexes para obter essas informações.

Causa

O SQL Server mantém dois tipos de informações armazenadas em cache para alocação de espaço na memória: cache de alocação e cache de espaço livre. O cache de alocação contém IDs de extensão para extensões recentemente alocadas para um índice específico. O cache de espaço livre contém números de página para páginas recentemente alocados de essas extensões alocadas. Ele também contém o estado das páginas. Se esses caches ficar vazios, os problemas que são descritos na seção "Sintomas" ocorrem.

Esses caches ficar vazios pelos seguintes motivos:
  • Você executar comandos diferentes que devem 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
    • ATUALIZAÇÃO DE ESTATÍSTICAS
  • Todos os descritores de objeto que são configurados usando a opção Abrir objetos são usados. Portanto, não descritores livres estão disponíveis.

Como Contornar

Para contornar este problema, use um dos seguintes métodos:
  • Converta tabelas de heap em tabelas que usam os índices em cluster.
  • Defina a opção de configuração Abrir objetos como um valor alto.
Esses métodos podem reduzir a taxa de crescimento para o espaço não utilizado que está alocado para uma tabela. As seções a seguintes descrevem esses dois métodos. As seções também descrevem por que esses métodos ajudam a resolver o problema descrito neste artigo.

Converter tabelas de heap em tabelas que usam os índices em cluster

Observação Depois de converter as tabelas de heap para tabelas que usam os índices em cluster, você pode executar operações de manutenção de índice periodicamente para recuperar qualquer espaço que é desnecessariamente não utilizado. Por exemplo, você pode executar os seguintes comandos:
DBCC DBREINDEX
DBCC INDEXDEFRAG 
A seguir é uma seqüência comum de operações que ocorrem quando você inserir um registro em uma tabela de heap:
  • 1. tente inserir uma linha na tabela.
  • 2. consulte o cache de espaço livre para id de índice 0 desta tabela.
  • 3. determine se as páginas válidas estão presentes no cache de espaço livre.
  • 4. se Sim:
    • 4.1. se houver espaço suficiente na página, inserir dados na página.
  • 5. se não:
    • 5.1. SQL Server deve alocar uma nova página para esta linha.
    • 5.2. consulte o cache de alocação para id de índice 0 desta tabela.
    • 5.3. determine se extensões válidas estão presentes no cache de alocação.
    • 5.4. se Sim:
      • 5.4.1. determine se qualquer uma das oito páginas na extensão pode ser usada para esta nova solicitação de alocação de página.
      • 5.4.2. se Sim:
        • 5.4.2.1. allocate uma página deste já alocado extensão.
        • 5.4.2.2. vá para a etapa 5.5.5.
      • 5.4.3. se não:
        • 5.4.3.1. vá para a etapa 5.5.1.
    • 5.5. se não:
      • 5.5.1. use os dados do mapa de alocação global (GAM) e o secundário SGAM (global alocação mapa) para localizar uma nova extensão a ser alocada.
      • 5.5.2. alocar uma nova extensão.
      • 5.5.3. use uma página dessa nova extensão para satisfazer a nova solicitação de alocação de página da etapa 5.1.
      • 5.5.4. preencha as informações sobre essa extensão recém-alocada no cache de alocação.
      • 5.5.5. preencher as informações sobre isso alocar recém-página no cache de espaço livre.
Se o cache de alocação e o cache de espaço livre estiverem vazias entre operações de inserção posteriores, SQL Server alocará novas páginas de extensões de novas, para que as operações de inserção podem bem-sucedida. Quando os metadados da tabela é removido da memória, o cache de alocação e o cache de espaço livre também são removidas. Portanto, na próxima vez que você executar uma operação de inserção que faz referência a tabela, esses caches são vazios. Nessa situação, o SQL Server deve executar a etapa 5 e em seguida, etapa 5.5. Esse comportamento faz com que extensões recentemente alocadas mostrar que oito páginas são alocadas quando apenas uma página é usada. Em um cenário de pior caso, pode ser perdidos 56 kilobytes (KB) de espaço para cada operação de inserção que você executar na tabela.

A seguir é a seqüência normal de operações que ocorrem quando você insere dados em uma tabela que possui um índice de cluster.
  • 1. tente inserir uma linha na tabela.
  • 2. percorrer a árvore de B para localizar a página de dados em que o SQL Server deve armazenar a chave de cluster.
  • 3. determine se há espaço suficiente na página para a nova linha.
  • 4. se Sim:
    • 4.1. inserir dados nesta página.
  • 5. se não:
    • 5.1. SQL Server deve alocar uma nova página para esta linha.
    • 5.2. consulte o cache de alocação para id de índice 1 da tabela.
    • 5.3. determine se extensões válidas estão presentes no cache de alocação.
    • 5.4. se Sim:
      • 5.4.1. determinam se você pode usar qualquer uma das oito páginas na extensão para esta nova solicitação de alocação de página.
      • 5.4.2. se Sim:
        • 5.4.2.1. allocate uma página deste já alocado extensão.
      • 5.4.3. se não:
        • 5.4.3.1. vá para a etapa 5.5.1.
    • 5.5. se não:
      • 5.5.1. use os dados de GAM e SGAM para localizar uma nova extensão a ser alocada.
      • 5.5.2. alocar uma nova extensão.
      • 5.5.3. use uma página dessa extensão para satisfazer a nova solicitação de alocação de página da etapa 5.1.
      • 5.5.4. preencha as informações sobre essa extensão recém-alocada no cache de alocação.
Se o cache de alocação e o cache de espaço livre serão limpo por motivos que são descritos na seção "Causa", não é necessário imediato para alocar uma nova página entre operações de inserção posteriores desta tabela. Isso é verdadeiro, desde que os dados inseridos podem caber na página existente onde a chave de cluster específica deve residir fisicamente. Quando a página de dados fica cheia, e se os caches estão vazios, o SQL Server deve executar a etapa 5 e, em seguida, etapa 5.5. Como este artigo indica se você usar um índice de cluster, o cenário em que novas páginas são alocadas ocorre com freqüência muito menor do que o cenário onde um registro é inserido em uma tabela de heap.

A seguir estão dois casos onde o problema ocorre, e o cache de alocação e o cache de espaço livre são vazias. Presume-se que o esquema da tabela permite para 100 linhas caber em uma página de dados.
  • Se a tabela tiver somente uma estrutura de armazenamento do heap, SQL Server pode alocar uma nova extensão para cada operação de inserção e usar apenas uma página em que extensão.
  • Se a tabela tem um índice de cluster, SQL Server pode alocar uma nova extensão para todas as operações de 100 inserção e use apenas uma página nessa extensão.

Defina objetos abertos opção de configuração para um valor alto

Esse problema ocorre principalmente porque o SQL Server usa todos os slots na área de memória designados com base na opção Abrir objetos . Ao enfrentar o problema descrito neste artigo, você pode definir o valor dessa opção para acomodar praticamente todas as tabelas que serão referenciadas na instância específica do SQL Server.

Para determinar um valor de opção Abrir objetos impedirá que esse problema, execute essas etapas:
  1. Determine o número total de tabelas que estão presentes na instância específica do SQL Server.

    Observação As tabelas incluem tabelas de usuário e tabelas do sistema. Você deve incluir as tabelas de bancos de dados do sistema.
  2. Estime um tamanho de buffer que fornece espaço para tabelas temporárias e tabelas de trabalho que podem usar consultas diferentes e aplicativos.
  3. Adicione o número de tabelas de usuário e tabelas do sistema ao buffer para determinar o número total de tabelas que pode ser acessado nesta instância do SQL Server. Esse total é o valor que você deve definir para a opção de configuração Abrir objetos .
Como o consumo de memória que é pré-alocado durante a SQL Server inicialização baseia-se esse valor, você não deve definir a opção de configuração Abrir objetos para um valor muito alto. Se você definir a opção Abrir objetos para um valor muito alto, memória que foi originalmente usada para outros propósitos, como para execução da consulta e para os buffers de dados, é usada em vez disso, para manter os metadados da tabela na área de memória para a opção Abrir objetos .

Não é recomendável que você altere a configuração objetos abertos em circunstâncias normais. Altere este valor somente se tiver certeza de que se você está enfrentando o problema que este artigo descreve.

Situação

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

Mais Informações

Por que as configurações de opção objetos abertos levam para esse problema

Sempre que uma consulta faz referência a um objeto específico (tabela), o SQL Server carrega informações sobre o objeto na memória. Todos os metadados do índice tem referências para as informações de objeto SQL Server foi carregado na memória. Os caches de alocação são discutidos neste artigo estão associados com um índice específico. A opção Abrir objetos controla o número de descritores de que a instância do SQL Server pode carregar na memória.

Quando o SQL Server inicia, o SQL Server atribui um conjunto específico de slots ou descritores , para manter a versão do objeto de metadados na memória. O número de slots alocados depende a edição do SQL Server e a memória que está configurada para SQL Server, conforme descrito na seção ? Sintomas ?. Todos esses slots originalmente fazem parte de uma lista livre. Um algoritmo específico é usado para atribuir slots de lista livre para os metadados do objeto. O algoritmo tem os seguintes dois modos de operação.

Modo 1

Depois do SQL Server for iniciado, ele usa um os descritores de memória da lista livre sempre que um novo objeto é referenciado. SQL Server continuará a usar todos os slots existentes quando ele carrega metadados sobre um objeto que é referenciado em uma consulta. Porque ainda existem slot entradas na lista livre, o SQL Server continuará a usar esses slots. Para slots existentes, SQL Server não reutilizar memória que foi usada por outro objeto.

Modo 2

Se um objeto está sendo recém-referenciado em uma consulta e a lista livre tornou-se vazia, o SQL Server verifica a lista de todos os objetos para determinar se há um slot podem ser removidos cujo metadados de objeto de memória existente. SQL Server deve manter os metadados do objeto no slot somente enquanto uma consulta faz referência a tabela. Quando a consulta for concluída, o SQL Server pode reutilizar o slot se uma nova consulta faz referência a uma tabela diferente.

Quando os metadados do objeto é removido da memória, todos os seus metadados do índice associado também será removido. Quando esse comportamento ocorre, o SQL Server também perde o cache de alocação e o cache de espaço livre. Em seguida, quando uma consulta diferente referencia esta tabela novamente, todos os caches de alocação estão vazios. Por isso, na próxima vez que o SQL Server tenta alocar uma página, SQL Server tenta alocar uma nova extensão.

Se continuar SQL Server recuperar slots que contêm metadados do objeto até que o SQL Server não é possível recuperar qualquer slots, o SQL Server aumenta o tamanho da lista de livre.

Referências

Para obter mais informações sobre como usar o procedimento sp_configure armazenados para alterar opções de configuração, visite a seguinte 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 obter mais informações sobre a opção Abrir objetos , visite o seguinte site da 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 máxima do servidor , visite o seguinte site da MSDN:
http://msdn2.microsoft.com/en-us/library/ms180797.aspx (http://msdn2.microsoft.com/en-us/library/ms180797.aspx)
Para obter mais informações sobre a tabela e índice arquitetura no SQL Server, visite o seguinte site da 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 Server 2005 Enterprise Edition
  • Microsoft SQL Server 2005 Express Edition
  • Microsoft SQL Server 2005 Standard Edition
  • Microsoft SQL Server 2005 Workgroup Edition
  • 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 traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes 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/ )