
我在我的项目上工作了一年多,在这一年中,它作为一个应用程序和数据都有了显著的增长。一直在不停地开发新功能。我很少回头重构代码。上周我注意到一些数据量大的页面加载缓慢。在最坏的情况下,一个视图可能需要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 专注于软件工程和生成式人工智能。在社交媒体上与他联系:X (@chuckconway) 或访问他的 YouTube。