Gerenciamento e Manutenção de Índices–SQL Server 2008
Autor: Fabio Martinez | Publicado: 2015-01-12T16:39:00-08:00

&nbsp; Os dados dentro de um índice são armazenados&nbsp; em ordem classificatória. Devido a repetidos eventos de inclusão e exclusão, podemos ter uma fragmentação dos índices, por exemplo, ao remover uma linha da tabela, a entrada referente ao índice também precisa ser removida, com isso, ficamos com uma lacuna na página do índice que não é recuperado pelo SQL Server devido ao custo da reclassificação do índice. Vamos entender como controlar a taxa de fragmentação de nossos índices: FILL FACTOR Determina a porcentagem de espaço livre em cada página de índice, ou seja, o quanto pode ser preenchido e quanto deve ser mantido em branco reservando para alterações realizadas na tabela (inclusão e alteração). Por exemplo ao criarmos um índice, se determinarmos FILL FACTOR em 90%, isso quer dizer que o SQL Server irá reservar apenas 10% de cada página com espaço livre que resulta em uma reorganização mais rápida pois temos 10% de espaço em branco para manobras em cada página de dados. E quando devo usar FILL FACTOR? A resposta é depende… do número de alterações que sua tabela recebe. CUIDADO: ao configurar o FILL FACTOR do seu índice com porcentagem de preenchimento muito baixo, pois o excesso de informação em branco nas páginas faz com que o SQL Server tenha que percorrer muitas paginas para retornar a informação desejada podendo tornar sua Query lenta. Desfragmentando um índice Com os espaços vazios deixados nas tabelas, periodicamente será necessário realizar a desfragmentação do índice que deve ser executada utilizando o comando ALTER INDEX:  REBUILD: Reconstrói todos os índices deixando as páginas com o preenchimento configurado na opção FILL FACTOR. A reconstrução do índice implica em criar toda a estrutura B-Tree novamente. Caso seja necessário a manutenção com concorrência no banco de dados, será necessário recriar o índice com a opção ONLINE para que seja obtido um bloqueio compartilhado e impeça alterações até a finalização do REBUILD.  Exemplo para reconstruir todos os índices de uma tabela:  ALTER INDEX ALL ON tabela REBUILD  REORGANIZE: Remove a fragmentação apenas do nível folha, ou seja, as páginas de nível intermediário e raiz não são desfragmentadas. REORGANIZE é uma operação que não gera bloqueio a longo prazo (online)  Exemplo para reorganizar o índice de uma tabela:  ALTER INDEX nome_índice ON tabela REORGANIZE  Recomendação: Devemos usar REBUILD quando a fragmentação do índice estiver acima de 40% e utilizar REORGANIZE quando a fragmentação estiver entre 10% a 40% Consultando a fragmentação de um índice A consulta abaixo deve ser utilizada para identificar o nível de fragmentação do seu índice: SELECT a.index_id, name, avg_fragmentation_in_percent,fragment_count,avg_fragment_size_in_pagesFROM sys.dm_db_index_physical_stats (DB_ID(N'AdventureWorksLT2008'), OBJECT_ID(N'SalesLT.Product'), NULL, NULL, NULL) AS aJOIN sys.indexes AS b ON a.object_id = b.object_id AND a.index_id = b.index_id;   avg_fragmentation_in_percent - O percentual de fragmentação. fragment_count - O número de fragmentos (fisicamente páginas de folha consecutivos) no índice. avg_fragment_size_in_pages - Número médio de páginas em um fragmento de um índice. &nbsp; Desativando um ìndice Um índice pode ser Desativado utilizando ALTER INDEX: ALTER INDEX nome_índice ON tabela DISABLE &nbsp; Obrigado