Eu sei que existem realmente três tipos de fragmentação que eu preciso me preocupar como DBA:
Fragmentação de índice nos arquivos de dados SQL, incluindo fragmentação de índice (tabela) em cluster. Identifique isso usando DBCC SHOWCONTIG (no SQL 2000) ou sys.dm_ db_ index_ physical_ stats (em 2005+).
Fragmentação VLF dentro dos arquivos de log SQL. Execute DBCC LOGINFO para ver quantos VLFs existem em cada um dos seus arquivos de log SQL.
Fragmentação física dos arquivos do banco de dados no disco rígido. Faça o diagnóstico usando o utilitário "Desfragmentador de disco" no Windows. (inspirado por este excelente post no blog )
Muita atenção é dada à fragmentação do índice (veja esta excelente resposta do Serverfault de Paul Randall), portanto esse não é o foco da minha pergunta.
Sei que posso impedir a fragmentação física (e a fragmentação VLF) quando o banco de dados é originalmente criado, planejando um arquivo de dados e tamanho de log razoáveis, porque essa fragmentação ocorre com maior frequência devido a crescimentos e encolhimentos frequentes, mas tenho algumas dúvidas sobre como corrigir fragmentação física, uma vez identificado:
Antes de tudo, a fragmentação física é relevante em uma SAN corporativa? Posso / devo usar o Desfragmentador do Windows em uma unidade SAN ou a equipe da SAN deve usar utilitários de desfragmentação internos? A análise de fragmentação que recebo da ferramenta Windows é precisa quando executada em uma unidade SAN?
Quão grande é a fragmentação física no desempenho do SQL? (Vamos assumir uma matriz de unidades internas, enquanto se aguarda o resultado da pergunta anterior.) É um negócio MAIOR do que a fragmentação interna do índice? Ou é realmente o mesmo tipo de problema (a unidade precisa fazer leituras aleatórias em vez de sequenciais)
A desfragmentação (ou a reconstrução) dos índices é uma perda de tempo se a unidade estiver fisicamente fragmentada? Preciso corrigir um antes de abordar o outro?
Qual é a melhor maneira de corrigir a fragmentação de arquivo físico em uma caixa SQL de produção? Sei que posso desativar os serviços SQL e executar o Windows Defrag, mas também ouvi falar de uma técnica em que você faz um backup completo, descarta o banco de dados e depois restaura o backup para uma unidade vazia. Esta última técnica é recomendada? A restauração de um backup como esse também cria índices do zero, eliminando a fragmentação interna do índice? Ou simplesmente retorna a ordem das páginas para a mesma de quando o backup foi realizado? (Estamos usando backups do Quest Lightspeed com compactação, se isso importa.)
ATUALIZAÇÃO : Boas respostas até agora sobre a desfragmentação de unidades SAN (NÃO) e se a desfragmentação do índice ainda vale a pena em unidades fisicamente fragmentadas (SIM).
Alguém mais gostaria de avaliar os melhores métodos para fazer a desfragmentação? Ou uma estimativa do tempo que você esperaria para desfragmentar uma grande unidade fragmentada, digamos 500 GB ou mais? Relevante, obviamente, porque é nessa hora que meu servidor SQL estará inoperante!
Além disso, se alguém tiver informações anedóticas sobre as melhorias de desempenho do SQL que você fez ao corrigir a fragmentação física, isso também seria ótimo. O post de Mike fala sobre descobrir o problema, mas não é específico sobre o tipo de melhoria que ele fez.