Skip to content

Innlegg

Indeksfragmentering i SQL Azure, Hvem visste det!

26. april 2015 • 2 min lesing

Indeksfragmentering i SQL Azure, Hvem visste det!

Jeg har vært på prosjektet mitt i over et år og det har vokst betydelig som applikasjon og i data i løpet av året. Det har vært kontinuerlige nye funksjoner. Jeg har sjelden gått tilbake og refaktorert kode. Forrige uke la jeg merke til at noen av de dataintensive sidene 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 indeksfragmentering i SQL Azure. Det er skyen! Den skal være immun mot lokale problemer… Tilsynelatende er indeksfragmentering også et problem i skyen.

Jeg fant et par spørringer på en MSDN-blogg som identifiserer de fragmenterte indeksene og deretter bygger dem om.

Etter å ha kjørt den første spørringen for å vise indeksfragmentering fant jeg noen indekser med over 50 prosent fragmentering. I følge artikkelen trenger alt over 10% oppmerksomhet.

Første spørring viser indeksfragmentering

--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 bygger om 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 spesialiserer seg på programvareutvikling og Generativ AI. Koble til ham på sosiale medier: X (@chuckconway) eller besøk ham på YouTube.

↑ Tilbake til toppen

Du liker kanskje også