Skip to content

Innlegg

Indeksfraksjonering i SQL Azure, Hvem Visste!

26. april 2015 • 2 min lesing

Indeksfraksjonering i SQL Azure, Hvem Visste!

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

Kilde

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.

↑ Tilbake til toppen

Du kan også like