Beiträge
Index-Fragmentierung in SQL Azure, wer hätte das gedacht!
26. April 2015 • 2 Min. Lesezeit

Ich arbeite seit über einem Jahr an meinem Projekt und es ist sowohl als Anwendung als auch in Bezug auf Daten während des Jahres erheblich gewachsen. Es gab ununterbrochen neue Features. Ich bin selten zurückgegangen und habe Code refaktoriert. Letzte Woche bemerkte ich, dass einige der datenintensiven Seiten langsam luden. Im schlimmsten Fall konnte eine Ansicht bis zu 30 Sekunden zum Laden benötigen. 10 Mal über meiner maximalen Ladezeit…
Nennt mich naiv, aber ich habe Index-Fragmentierung in SQL Azure nicht in Betracht gezogen. Es ist die Cloud! Sie soll immun gegen lokale Probleme sein… Anscheinend ist Index-Fragmentierung auch ein Problem in der Cloud.
Ich fand ein paar Abfragen in einem MSDN-Blog, die die fragmentierten Indizes identifizieren und sie dann neu aufbauen.
Nach dem Ausführen der ersten Abfrage zur Anzeige der Index-Fragmentierung fand ich einige Indizes mit über 50 Prozent Fragmentierung. Laut dem Artikel benötigt alles über 10% Aufmerksamkeit.
Erste Abfrage zeigt Index-Fragmentierung an
--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
Zweite Abfrage baut die Indizes neu auf
--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 ist spezialisiert auf Software-Engineering und Generative KI. Verbinden Sie sich mit ihm in den sozialen Medien: X (@chuckconway) oder besuchen Sie ihn auf YouTube.