A fragmentação de índice do SQL Server é uma fonte comum de degradação do desempenho do banco de dados. A fragmentação ocorre quando há muito espaço vazio em uma página de dados (fragmentação interna) ou quando a ordem lógica das páginas no índice não corresponde à ordem física das páginas no arquivo de dados (fragmentação externa).
Os problemas de desempenho relacionados à fragmentação são observados com mais frequência ao executar consultas que realizam verificações de índice. As consultas que realizam buscas de índice podem não ser afetadas pela fragmentação de alto índice.
Compreendendo os tipos de fragmentação de índice do SQL Server
Fragmentação de índice interno
A fragmentação interna ocorre quando as páginas de dados têm muito espaço livre. Este espaço extra é introduzido através de algumas avenidas diferentes:
- O SQL Server armazena dados em páginas de 8 KB. Portanto, quando você insere menos de 8 KB de dados em uma tabela, fica com um espaço em branco na página.
- Por outro lado, se você inserir mais dados do que a página tem espaço, o excesso será enviado para outra página. É improvável que os dados adicionais preencham perfeitamente as páginas subsequentes, então você fica novamente com um espaço em branco em uma página.
- O espaço em branco em uma página de dados também ocorre quando os dados são excluídos de uma tabela.
A fragmentação interna causa principalmente problemas de desempenho quando o SQL Server faz uma verificação de índice. O desempenho diminui quando o SQL Server precisa verificar muitas páginas parcialmente preenchidas para encontrar os dados que está procurando.
Fragmentação de índice externo
A fragmentação externa é resultado de páginas de dados fora de ordem. Isso é causado pela inserção ou atualização de dados em páginas de folha completa. Quando os dados são adicionados a uma página inteira, o SQL Server cria uma divisão de página para acomodar os dados extras e a nova página é separada da página original.
A fragmentação externa causa problemas de desempenho aumentando a E/S aleatória. Quando as páginas não são sequenciais, o SQL Server precisa ler dados de vários locais, o que consome mais tempo do que ler em ordem.
Como evitar a fragmentação do índice do SQL Server
Não é possível evitar completamente a fragmentação do índice, mas existem maneiras de minimizar sua ocorrência e diminuir o efeito da fragmentação no desempenho do banco de dados. Aqui estão alguns prós e contras para evitar a fragmentação do índice do SQL Server:
FAÇA: Escolha chaves de cluster que sejam valores cada vez maiores ou valores cada vez menores. Isso reduzirá as divisões de página porque, quando você inserir registros, eles serão colocados no início ou no final da cadeia lógica de páginas.
NÃO: Insira registros com valores de chave aleatórios. Escolha valores de chave estáticos para que, uma vez que um registro seja colocado, ele nunca precise se mover e não fique fora de ordem.
NÃO: Atualize os registros para torná-los mais longos. Adicionar registros a um índice durante uma atualização pode exigir que o SQL Server envie alguns dados para uma nova página. Isso pode resultar em páginas de folha não sequenciais e, eventualmente, problemas de desempenho.
NÃO: Atualizar colunas de chave de índice. As atualizações de coluna de chave exigem uma exclusão completa de linha seguida por uma inserção de linha completa usando o novo valor de chave. Se a nova linha for inserida em uma página sem espaço suficiente, você obterá uma divisão de página.
FAÇA: Esteja ciente dos recursos que podem causar divisões de página. Lembre-se dos possíveis resultados finais da modificação de qualquer recurso que envolva índices. Por exemplo, atualizar colunas de largura variável (mesmo em colunas sem chave) em um índice clusterizado pode causar divisões de página.
FAÇA: Implemente fatores de preenchimento de índice apropriados. Analise a fragmentação na configuração padrão do fator de preenchimento e ajuste conforme necessário para minimizar a fragmentação excessiva em carga normal.
Como corrigir a fragmentação do índice do SQL Server
Como evitar a fragmentação 100% do tempo é impossível, é importante saber como corrigir a fragmentação do índice do SQL Server se o desempenho estiver sendo prejudicado.
Antes de decidir como abordar o problema de fragmentação de índice do SQL Server, primeiro você precisa determinar a extensão do problema com o qual está lidando.
O melhor lugar para começar é usar o DMF sys.dm_db_index_physical_stats para analisar o nível de fragmentação de seus índices. Depois de saber a extensão da fragmentação do índice, você pode traçar seu plano de ataque com uma das três soluções:reconstruir o índice, reorganizar o índice ou não fazer nada.
Reconstruir: Reconstrua índices quando a fragmentação atingir mais de 30 por cento.
Reorganizar: Reorganize índices com fragmentação entre 11 e 30 por cento.
Ignorar: Níveis de fragmentação de 10% ou menos não devem representar um problema de desempenho, portanto, você não precisa fazer nada.
A fragmentação de índice do SQL Server é inevitável, mas você pode minimizar os efeitos negativos da fragmentação no desempenho do banco de dados. Siga algumas práticas recomendadas simples e fique por dentro da manutenção programada para mitigar quaisquer problemas de desempenho importantes relacionados à fragmentação.