Skip to content

Beiträge

Indexfragmentierung in SQL Azure, wer hätte das gedacht!

26. April 2015 • 2 min Lesezeit

Indexfragmentierung in SQL Azure, wer hätte das gedacht!

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

Quelle

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.

↑ Nach oben

Das könnte dir auch gefallen