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.
2m5kkk
dkk mdm
d,,ddfdf

                  
3
mmh uyu
yt76nbi
jufmdfdf
mr9fdfdf


2

mmh uyu
yt76nbi dd
jufm df yrt
mr9fdf rr


5
aabb .. .d.
2m5kkk re
dkk mdm t
d,,d u juu

4

mmh uyu
yt76nbi df
jufm tu uua
mr9f yy red

(2) Índice com fragmentação Interna <=> páginas sub-utilizadas, com muito espaço disponível

                1
aabb .. .d.

                  
2
m


3


yuu


4
aabb .. .d.

2m5kkk re

5

mmh

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
aabb .. .d.
2m5kkk
dkk mdm
d,,ddfdf

                  
2
mmh uyu
yt76nbi dd
jufm df yrt
mr9fdf rr


3

mmh uyu
yt76nbi
jufmdfdf
mr9fdfdf


4
mmh uyu
yt76nbi df
jufm tu uua
mr9f yy red

5

aabb .. .d.
2m5kkk re
dkk mdm t
d,,d u juu

(2.1) Indice após desfragmentação interna

                1
aabb .. .d.
m
yuu
aabb .. .d.

                  
2
2m5kkk re
mmh

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:

28-07pic01.JPG

Agora que sabemos o nome dos índices podemos verificar a fragmentação do índice CustomerId.

28-07pic02.JPG

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.

28-07pic03.JPG

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!