Posts
Fragmentação de Índice no SQL Azure, Quem Sabia!
26 de abril de 2015 • 2 min de leitura
Estou em meu projeto há mais de um ano e ele cresceu significativamente como aplicação e em dados durante o ano. Foram inúmeros novos recursos. Raramente voltei e refatorei código. Na semana passada, notei que algumas páginas com muitos dados estavam carregando lentamente. No pior caso, uma visualização poderia levar até 30 segundos para carregar. 10 vezes meu tempo máximo de carregamento…
Pode me chamar de ingênuo, mas não considerei fragmentação de índice no SQL Azure. É a nuvem! Deveria ser imune a problemas locais… Aparentemente, a fragmentação de índice também é um problema na nuvem.
Encontrei algumas consultas em um blog do MSDN que identificam os índices fragmentados e depois os reconstrói.
Após executar a primeira consulta para mostrar a fragmentação de índice, encontrei alguns índices com mais de 50% de fragmentação. De acordo com o artigo, qualquer coisa acima de 10% precisa de atenção.
Primeira Consulta Exibe Fragmentação de Índice
--Get the fragmentation percentage
SELECT
DB_NAME() AS DBName
,OBJECT_NAME(ps.object_id) AS TableName
,i.name AS IndexName
,ips.index_type_desc
,ips.avg_fragmentation_in_percent
FROM sys.dm_db_partition_stats ps
INNER JOIN sys.indexes i
ON ps.object_id = i.object_id
AND ps.index_id = i.index_id
CROSS APPLY sys.dm_db_index_physical_stats(DB_ID(), ps.object_id, ps.index_id, null, 'LIMITED') ips
ORDER BY ps.object_id, ps.index_id
Segunda Consulta Reconstrói os Índices
--Rebuild the indexes
DECLARE @TableName varchar(255)
DECLARE TableCursor CURSOR FOR
(
SELECT '[' + IST.TABLE_SCHEMA + '].[' + IST.TABLE_NAME + ']' AS [TableName]
FROM INFORMATION_SCHEMA.TABLES IST
WHERE IST.TABLE_TYPE = 'BASE TABLE'
)
OPEN TableCursor
FETCH NEXT FROM TableCursor INTO @TableName
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT('Rebuilding Indexes on ' + @TableName)
Begin Try
EXEC('ALTER INDEX ALL ON ' + @TableName + ' REBUILD with (ONLINE=ON)')
End Try
Begin Catch
PRINT('Cannot do rebuild with Online=On option, taking table ' + @TableName+' down for douing rebuild')
EXEC('ALTER INDEX ALL ON ' + @TableName + ' REBUILD')
End Catch
FETCH NEXT FROM TableCursor INTO @TableName
END
CLOSE TableCursor
DEALLOCATE TableCursor
Autor: Chuck Conway é um Engenheiro de IA com quase 30 anos de experiência em engenharia de software. Ele constrói sistemas de IA práticos—pipelines de conteúdo, agentes de infraestrutura e ferramentas que resolvem problemas reais—e compartilha o que está aprendendo ao longo do caminho. Conecte-se com ele nas redes sociais: X (@chuckconway) ou visite-o no YouTube e no SubStack.