Alavancando Performance - Desfragmentando
Fragmentar é o mesmo que quebrar em partes ou despedaçar. Dizemos que um índice está fragmentado quando suas páginas não estão contíguas OU apresentam-se pouco utilizadas. Exemplos:
(1) Índice com fragmentação Externa <=> as páginas estão desordenadas (1-2-2-5-4...)
1 aabb .. .d. |
|
|
|
4 |
(2) Índice com fragmentação Interna <=> páginas sub-utilizadas, com muito espaço disponível
1 |
|
|
2m5kkk re |
5 |
Tanto a fragmentação externa quanto interna irão requerer um custo maior de I/O para operações de leitura. Após um processo de desfragmentação desse índice, reverteríamos esse quadro para:
(1.1) Indice após desfragmentação externa
1 |
|
|
|
5 |
(2.1) Indice após desfragmentação interna
1 |
|
Repare que um processo de leitura seqüencial nos dois modelos é bem mais eficiente após desfragmentação: em (1.1) as páginas estão dispostas sequencialmente, evitando-se o vai-e-vem dos cabeçotes de leitura que ocorriam em (1); em (2.1) o número de páginas do índice caiu para duas páginas, o que reduz consideravelmente o custo de I/O envolvido numa operação de leitura.
Agora como saber se um índice está fragmentado? A resposta está no comando DBCC ShowContig. Esse comando deve ser executado sobre uma tabela, especificando-se o índice que se deseja analisar.
Primeiramente temos que levantar os índices da tabela que desejamos analisar. Para verificar os índices existentes na tabela Orders no database NorthWind com o comando sp_HelpIndex:
Agora que sabemos o nome dos índices podemos verificar a fragmentação do índice CustomerId.
Vamos agora traduzir o que o showcontig nos revelou:
- Apesar existirem apenas 4 páginas na tabela (=Pages Scanned), a tabela utiliza 2 extents (=Extents Scanned). Isso é ruim, e é um indicador de fragmentação. Sabemos que uma extent acomoda 8 páginas, então porque 2 extents são utilizadas para armazenar somente 4 páginas ???
- Para scanear toda a tabela foram realizadas 2 extents switches, o que significa que a leitura começa na extent-1, vai para a extent-2 e depois retorna para a extent-1 para finalizar o serviço. Esse vai-e-volta é um indicador de fragmentação externa.
- O número médio de páginas por extent (=Avg.Pages Per Extent) é 2. Esse número é tanto melhor quanto mais próximo. Outro indicador de fragmentação.
- Scan Density é o percentual de fragmentação externa. Num mundo perfeito, esse indicador deve estar próximo de 100%.
- As páginas desse indice estão sub-utilizadas, é o que diz o indicador Avg.Page Density = 51.25%. Num mundo perfeito, quanto mais próximo de 100%, melhor.
Bom até agora constatamos um problema, e agora? A solução está em reestruturar o índice com o comando DBCC dbReindex. A reindexação corrige problemas de fragmentação externa E interna como veremos a seguir.
Compare os resultados dos comandos showcontig antes e depois da desfragmentação e sinta a diferença.
Por hoje é só.
Um grande abraço a todos e até a próxima!