Skip to content

文章

SQL Azure 中的索引碎片化,谁知道呢!

2015年4月26日 • 3 分钟阅读

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

来源

作者:Chuck Conway 是一位 AI 工程师,拥有近 30 年的软件工程经验。他构建实用的 AI 系统——内容管道、基础设施代理和解决实际问题的工具——并分享他沿途的学习成果。在社交媒体上与他联系:X (@chuckconway) 或访问他的 YouTubeSubStack

↑ 返回顶部

你可能也喜欢