Eu tenho um script identificando quais índices reconstruir.
select
'alter index ' + name + ' on ' + @dbname + '.dbo.' + OBJECT_NAME(a.object_id) + ' rebuild;'
from sys.dm_db_index_physical_stats (DB_ID(@dbname), NULL, NULL, NULL, NULL) AS a
inner join sys.indexes AS b ON a.object_id = b.object_id AND a.index_id = b.index_id
where avg_fragmentation_in_percent > 30
Que, por exemplo, gera:
alter index FooIndex on FooDb.dbo.FooTable rebuild;
Mas depois de executar a instrução alter, o índice ainda tem um valor de fragmentação alto e, se eu executá-lo novamente, não diminui (50%). Qualquer entrada sobre o que poderia estar errado seria muito apreciada.
ATUALIZADO: Aumentei manualmente o tamanho do BD o que conseguiu diminuir a fragmentação em alguns dos índices, mas ainda não em todos. Ainda tem um casal em torno de 50%.
//Daniel
É um índice pequeno? Índices pequenos sempre mostrarão altos níveis de fragmentação. Você pode ler mais no site de Ola Hallengren, que possui um pacote de manutenção do SQL Server altamente classificado - veja a configuração PageCountLevel, que especifica que a Microsoft recomenda deixar índices abaixo de 1.000 páginas - com o link.
http://ola.hallengren.com/sql-server-index-and-statistics-maintenance.html
Dê uma olhada no fragment_count - esse é um dos campos na exibição sys.dm_db_index_physical_stats. Você realmente deve reconstruir índices com um determinado limite de página e, de acordo com as práticas recomendadas, é melhor reconstruir um índice com mais de 1.000 páginas.
alguma referência pode ser encontrada http://connect.microsoft.com/SQLServer/feedback/details/244214/index-rebuild-doesnt-affect-fragmentation
Você também deve filtrar por considerar tabelas pequenas - a definição de 'pequeno', 'grande' etc. pode muito bem não ser capaz de melhorar muito os níveis de fragmentação de qualquer maneira). Portanto, adicione uma
WHERE
cláusula queSUM(reserved_page_count) FROM sys.dm_db_partition_stats
analise e inclua apenas aqueles com mais de, digamos, 1000, como @Kin mencionou.Também sugiro que, a menos que você esteja realmente enfrentando problemas de desempenho devido à fragmentação e tenha provado que essa é a fonte, não fique obcecado com os níveis de fragmentação. Ter números baixos não lhe dá nenhum prêmio, e essa manutenção constante pode ser pior para o desempenho geral do sistema do que simplesmente deixá-lo sozinho.
Veja também Por que meu banco de dados ainda está fragmentado depois que reconstruí e reindexei tudo?