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