Jeg har vært på prosjektet mitt i over ett år og det har vokst betydelig som applikasjon og i data i løpet av året. Det har vært uavbrutt nye funksjoner. Jeg har sjelden gått tilbake og refaktorert kode. Forrige uke la jeg merke til at noen av datasidene som var tunge lastet sakte. I verste fall kunne en visning ta opptil 30 sekunder å laste. 10 ganger over min maksimale lastetid…
Kall meg naiv, men jeg vurderte ikke indeksfraksjonering i SQL Azure. Det er skyen! Det skal være immunt mot lokale problemer… Tilsynelatende er indeksfraksjonering også et problem i skyen.
Jeg fant et par spørringer på en MSDN-blogg som identifiserer de fragmenterte indeksene og deretter gjenoppbygger dem.
Etter å ha kjørt den første spørringen for å vise indeksfraksjonering fant jeg noen indekser med over 50 prosent fraksjonering. I følge artikkelen trenger alt over 10% oppmerksomhet.
Første spørring Vis indeksfraksjonering
--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
Andre spørring gjenoppbygger indeksene
--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
Forfatter: Chuck Conway er en AI-ingeniør med nesten 30 års erfaring innen programvareutvikling. Han bygger praktiske AI-systemer—innholdspipelines, infrastrukturagenter og verktøy som løser virkelige problemer—og deler det han lærer underveis. Koble til ham på sosiale medier: X (@chuckconway) eller besøk ham på YouTube og på SubStack.