Primeiro, é importante considerar se a fragmentação é importante.
Se sua consulta estiver apenas fazendo buscas em linha única, talvez você não note fragmentação. Nas SANs modernas, o cache no nível da SAN pode fazer com que as IO phyiscal sejam rápidas o suficiente para que a fragmentação não importe. No SSD, o padrão aleatório de E / S causado pela varredura de um índice fragmentado pode realmente resultar em melhor desempenho que os dados não fragmentados.
Muitas vezes, as pessoas percebem que a reconstrução de um índice corrigia um problema de desempenho. A reconstrução de um índice também cria novas estatísticas. Pode ser que a correção real seja uma nova estatística, não reconstruindo o índice. UPDATE STATISTICS...WITH FULLSCAN
pode ser uma maneira mais barata, rápida e menos invasiva de resolver o mesmo problema de desempenho.
Se você não está tendo problemas causados pela fragmentação, pode estar gastando tempo e esforço significativos sem obter ganhos reais.
Segundo, existem dois tipos de fragmentação:
Fragmentação física. É nisso que a maioria das pessoas pensa quando pensa em fragmentação. As páginas estão com defeito e precisam ser reordenadas. Ao digitalizar um índice, esse tipo de fragmentação pode às vezes ser um problema. Eu geralmente notei que isso tem o maior impacto no desempenho com leituras físicas . Se você estiver vendo os resultados sys.dm_db_index_physical_stats
, esse número é a avg_fragmentation_in_percent
coluna.
Fragmentação de baixa densidade. Essa fragmentação é causada por páginas preenchidas apenas parcialmente com dados. Você tem baixa densidade de dados porque seus dados estão espalhados por mais páginas do que o necessário. Como resultado, a leitura dos dados requer mais pedidos de veiculação porque os dados estão espalhados por mais páginas do que o necessário. Isso pode afetar as leituras lógicas e físicas. Se você estiver vendo os resultados sys.dm_db_index_physical_stats
, esse número é a avg_page_space_used_in_percent
coluna. Esta coluna é preenchida apenas ao usar o modo SAMPLED
ou DETAILED
.
Então o que fazer sobre isso:
Fragmentação física : se você está simplesmente buscando números altos avg_fragmentation_in_percent
, considere realmente se está desperdiçando seu tempo. Verifique se você possui uma consulta real com desempenho ruim e use um ambiente de teste para confirmar que está corrigindo um problema eliminando a fragmentação.
Você pode resolver a fragmentação física fazendo ALTER INDEX...REORGANIZE
. A REORGANIZE
operação está online, movendo as páginas uma por vez para reorganizá-las novamente em ordem física. Se você interromper uma REORGANIZE
instrução no meio do processo, qualquer trabalho que já tenha sido executado será mantido - apenas a página que está sendo movida no momento será revertida. Fazer uma REORGANIZE
tabela grande e altamente fragmentada pode exigir mais espaço total no log de transações e, no modo de recuperação total, pode gerar uma quantidade significativa de backups do log de transações. Também pode levar mais tempo para REORGANIZE
um índice altamente fragmentado do que para REBUILD
ele.
Você verá conselhos para executar REBUILD
índices altamente fragmentados em vez de REORGANIZE
- Isso ocorre porque a reconstrução do zero pode ser mais eficiente. No entanto, a reorganização pode ser uma operação "mais on-line" e, às vezes, é preferível, mesmo para índices altamente fragmentados.
A fragmentação de baixa densidade não pode ser corrigida por REORGANIZE
. Só pode ser corrigido fazendo um ALTER INDEX...REBUILD
. Fazendo o índice com ONLINE=ON
, você deve minimizar o bloqueio. No entanto, REBUILD
ainda é necessário bloquear por um momento para trocar o índice antigo pelo novo índice. Em um sistema muito ocupado, atingir esse bloqueio exclusivo pode às vezes ser um problema. Você deve poder confirmar se está tendo esse problema usando algo como sp_whoisactive para examinar o bloqueio durante sua reconstrução e observando os detalhes dos bloqueios e esperas. O uso da WAIT_AT_LOW_PRIORITY
opção pode ser útil se você souber que há um próximo período de baixa utilização e sua reconstrução pode "se infiltrar" nessa troca quando a atividade cair suficientemente baixa para atingir esse bloqueio. Observe que uma longa duraçãoREBUILD
A operação também será uma transação aberta de longa duração. As transações abertas de longa execução podem ter seus próprios problemas, relacionados ao uso / reutilização do log de transações. Se você estiver usando o espelhamento ou os Grupos de disponibilidade, também haverá considerações para refazer o log de transações na réplica secundária.
REORGANIZE
reduzirá a fragmentação das páginas em folhas e o espaço compactoREBUILD
, apenas com menos eficiência. Você tem certeza de que o tamanho grande é devido à fragmentação? Qual é o fator de preenchimento?