Skip to content

Посты

Фрагментация индексов в SQL Azure, кто бы мог подумать!

26 апреля 2015 г. • 2 мин чтения

Фрагментация индексов в SQL Azure, кто бы мог подумать!

Я работаю над своим проектом уже больше года, и он значительно вырос как приложение и по объему данных за этот год. Это были непрерывные новые функции. Я редко возвращался назад и рефакторил код. На прошлой неделе я заметил, что некоторые страницы с большим объемом данных загружались медленно. В худшем случае одно представление могло загружаться до 30 секунд. В 10 раз дольше моего максимального времени загрузки…

Называйте меня наивным, но я не учитывал фрагментацию индексов в SQL Azure. Это же облако! Оно должно быть защищено от проблем локальных систем… Очевидно, фрагментация индексов также является проблемой в облаке.

Я нашел пару запросов в блоге MSDN, которые выявляют фрагментированные индексы и затем перестраивают их.

После выполнения первого запроса для отображения фрагментации индексов я обнаружил некоторые индексы с более чем 50-процентной фрагментацией. Согласно статье, все что свыше 10% требует внимания.

Первый запрос отображает фрагментацию индексов

--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

Второй запрос перестраивает индексы

--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

Source

Автор: Чак Конвей специализируется на разработке программного обеспечения и генеративном ИИ. Свяжитесь с ним в социальных сетях: X (@chuckconway) или посетите его на YouTube.

↑ Наверх

Вам также может понравиться