Posts
Fragmentação de Índices no SQL Azure, Quem Diria!
26 de abril de 2015 • 2 min de leitura

Estou no meu projeto há mais de um ano e ele cresceu significativamente como aplicação e em dados durante o ano. Tem sido recursos novos sem parar. Raramente voltei atrás e refatorei código. Na semana passada notei que algumas das páginas com muitos dados estavam carregando lentamente. No pior caso, uma visualização podia levar até 30 segundos para carregar. 10 vezes acima do meu tempo máximo de carregamento…
Me chamem de ingênuo, mas eu não considerava fragmentação de índices no SQL Azure. É a nuvem! Deveria ser imune a problemas locais… Aparentemente fragmentação de índices também é um problema na nuvem.
Encontrei algumas consultas em um blog do MSDN, que identificam os índices fragmentados e então os reconstrói.
Após executar a primeira consulta para mostrar fragmentação de índices, encontrei alguns índices com mais de 50 por cento de fragmentação. De acordo com o artigo, qualquer coisa acima de 10% precisa de atenção.
Primeira Consulta Exibe Fragmentação de Índices
--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 é especialista em engenharia de software e IA Generativa. Conecte-se com ele nas redes sociais: X (@chuckconway) ou visite-o no YouTube.