Skip to content

Posts

Fragmentação de Índice no SQL Azure, Quem Sabia!

26 de abril de 2015 • 2 min de leitura

Fragmentação de Índice no SQL Azure, Quem Sabia!

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

Fonte

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.

↑ Voltar ao topo

Você também pode gostar