Beiträge
Indexfragmentierung in SQL Azure, wer hätte das gedacht!
26. April 2015 • 2 min Lesezeit
Ich bin seit über einem Jahr in meinem Projekt tätig und es ist sowohl als Anwendung als auch in den Daten im Laufe des Jahres erheblich gewachsen. Es gab ständig neue Funktionen. Ich bin selten zurückgegangen und habe Code refaktoriert. Letzte Woche bemerkte ich, dass einige datenlastige Seiten langsam geladen wurden. Im schlimmsten Fall konnte eine Ansicht bis zu 30 Sekunden zum Laden benötigen. 10-mal länger als meine maximale Ladezeit…
Nennen Sie mich naiv, aber ich habe die Indexfragmentierung in SQL Azure nicht berücksichtigt. Es ist die Cloud! Sie soll immun gegen lokale Probleme sein… Anscheinend ist die Indexfragmentierung auch in der Cloud ein Problem.
Ich fand ein paar Abfragen in einem MSDN-Blog, die die fragmentierten Indizes identifizieren und sie dann neu erstellen.
Nach dem Ausführen der ersten Abfrage zur Anzeige der Indexfragmentierung fand ich einige Indizes mit über 50 Prozent Fragmentierung. Nach dem Artikel benötigt alles über 10 % Aufmerksamkeit.
Erste Abfrage – Indexfragmentierung anzeigen
--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 – Indizes neu erstellen
--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 ein KI-Ingenieur mit fast 30 Jahren Erfahrung in der Softwareentwicklung. Er entwickelt praktische KI-Systeme – Content-Pipelines, Infrastruktur-Agenten und Tools, die echte Probleme lösen – und teilt seine Erkenntnisse unterwegs. Verbinden Sie sich mit ihm in den sozialen Medien: X (@chuckconway) oder besuchen Sie ihn auf YouTube und auf SubStack.