Я работаю над своим проектом более года, и он значительно вырос как приложение и по объему данных за этот год. Это был непрерывный поток новых функций. Я редко возвращался и рефакторил код. На прошлой неделе я заметил, что некоторые страницы с интенсивной работой с данными загружались медленно. В худшем случае один вид мог загружаться до 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
Автор: Chuck Conway — инженер AI с почти 30-летним опытом разработки программного обеспечения. Он создает практические системы AI — конвейеры контента, агенты инфраструктуры и инструменты, которые решают реальные проблемы — и делится тем, что он узнает на этом пути. Свяжитесь с ним в социальных сетях: X (@chuckconway) или посетите его на YouTube и на SubStack.