Como posso saber quando é hora de desfragmentar meu banco de dados SQLServer?

9

Qual é a melhor prática para medir a fragmentação do banco de dados SQLServer / rolloff de desempenho e determinar quando desfragmentar uma tabela do banco de dados SQLServer?

Estou mais interessado em saber quais são as métricas úteis e qual nível de degradação do desempenho deve desencadear a desfragmentação.

Jeff Leonard
fonte

Respostas:

22

Tenho certeza de que haverá algumas respostas interessantes para isso, pois há muitas divergências sobre quais métricas devem ser observadas. Escrevi DBCC INDEXDEFRAG, SHOWCONTIG e projetei suas substituições para 2005, além de escrever o conteúdo do Books Online, portanto, darei a minha opinião e explicarei os números no Books Online e no assistente de plano de manutenção para 2005, que eu escolhi.

As duas melhores métricas para analisar a fragmentação do índice são: 1) (2005) fragmentação média em porcentagem / (2000) fragmentação de varredura lógica 2) (2005) densidade média da página / (2000) bytes médios livres por página

Isso se aplica igualmente a índices agrupados e não clusterizados.

1 está medindo quanta fragmentação lógica existe. É quando a ordem lógica das páginas no nível folha de um índice não corresponde à ordem física. Isso evita que o Mecanismo de Armazenamento faça um readahead eficiente durante as varreduras de intervalo. Portanto, o número 1 afeta o desempenho da varredura de alcance, não o desempenho da pesquisa de singleton.

2 está medindo quanto espaço desperdiçado existe em cada página no nível da folha de um índice. Espaço desperdiçado significa que você está usando mais páginas para armazenar os registros, o que significa mais espaço em disco para armazenar o índice, mais IOs para ler o índice e mais memória para armazenar as páginas na memória no buffer pool.

Limiares? Minha regra geral é menos de 10% de fragmentação, não faça nada. 10-30%, faça um ALTER INDEX ... REORGANIZE (2005) / DBCC INDEXDEFRAG (2000). Mais de 30%, faça um ALTER INDEX ... REBUILD (2005) / DBCC DBREINDEX (2000). Estas são generalizações completas e os limites para você variam.

Para encontrar seus limites, faça um rastreamento do desempenho da carga de trabalho em relação aos níveis de fragmentação e decida quando a degradação do desempenho é excessiva. Nesse ponto, você precisará resolver a fragmentação. Há um ato de equilíbrio entre viver com a fragmentação e receber o recurso de removê-la.

Não mencionei aqui as vantagens e desvantagens entre os dois métodos de remoção da fragmentação, como FILLFACTOR / PADINDEX para tentar mitigar a fragmentação e fazer menos desfragmentação, alterações nos padrões de esquema / acesso para aliviar a fragmentação ou diferentes tipos de planos de manutenção .

Oh, aliás, eu sempre recomendo não se preocupar com a fragmentação em índices com menos de 1000 páginas. Isso ocorre porque o índice provavelmente é principalmente residente em memória (e porque as pessoas pediram um número e eu tive que criar um).

Você pode ler mais sobre isso no meu artigo da TechNet Magazine sobre manutenção de banco de dados em http://technet.microsoft.com/en-us/magazine/cc671165.aspx , no whitepaper baseado em 2000 sobre as melhores práticas de desfragmentação de índice que eu ajudei a escrever em http://technet.microsoft.com/en-us/library/cc966523.aspx e no meu blog na categoria Fragmentação em http://www.sqlskills.com/BLOGS/PAUL/category/Fragmentation.aspx .

Eu meio que respondi demais, eu acho, mas é um dos meus botões de atalho. Espero que isto ajude :-)

Paul Randal
fonte