Articles
Fragmentation d'index dans SQL Azure, qui l'aurait cru !
26 avril 2015 • 2 min de lecture

Je travaille sur mon projet depuis plus d’un an et il a considérablement grandi en tant qu’application et en données au cours de l’année. Ça a été des nouvelles fonctionnalités sans arrêt. J’ai rarement fait marche arrière pour refactoriser le code. La semaine dernière, j’ai remarqué que certaines pages lourdes en données se chargeaient lentement. Dans le pire des cas, une vue pouvait prendre jusqu’à 30 secondes à se charger. 10 fois plus que mon temps de chargement maximum…
Appelez-moi naïf, mais je n’avais pas pensé à la fragmentation d’index dans SQL Azure. C’est le cloud ! C’est censé être immunisé contre les problèmes sur site… Apparemment, la fragmentation d’index est aussi un problème dans le cloud.
J’ai trouvé quelques requêtes sur un blog MSDN qui identifient les index fragmentés et les reconstruisent ensuite.
Après avoir exécuté la première requête pour afficher la fragmentation d’index, j’ai trouvé certains index avec plus de 50 pour cent de fragmentation. Selon l’article, tout ce qui dépasse 10% nécessite une attention.
Première requête : Afficher la fragmentation d’index
--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
Deuxième requête : Reconstruire les index
--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
Auteur : Chuck Conway se spécialise dans l’ingénierie logicielle et l’IA générative. Connectez-vous avec lui sur les réseaux sociaux : X (@chuckconway) ou visitez-le sur YouTube.