Skip to content

Posts

Fragmentação de Índices no SQL Azure, Quem Diria!

26 de abril de 2015 • 2 min de leitura

Fragmentação de Índices no SQL Azure, Quem Diria!

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

Fonte

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.

↑ Voltar ao topo

Você também pode gostar