T-SQL运维脚本——SQLServer如何判断是否需要重建索引
在SQL Server中,可以通过查询系统视图和动态管理视图来判断是否需要重建索引。以下是一个基本的SQL脚本,用于检查各个索引的健康状况,并据此推荐是否需要重建索引:
SELECT OBJECT_NAME(i.object_id) AS 'Table Name', i.name AS 'Index Name', i.type_desc AS 'Index Type'
,avg_fragmentation_in_percent
,CASE WHEN avg_fragmentation_in_percent>10.0 THEN 'HEAVILY_FRAGMENTED'
WHEN avg_fragmentation_in_percent>2.0 THEN 'MODERATELY_FRAGMENTED'
WHEN avg_fragmentation_in_percent>1.0 THEN 'LIGHTLY_FRAGMENTED' ELSE 'NOT_FRAGMENTED' END AS 'Fragmentation Level'
,CASE WHEN avg_fragmentation_in_percent>20.0 AND i.name NOT LIKE 'PK_%' THEN 'REBUILD' ELSE 'NONE' END AS 'Recommended Action'
FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'LIMITED') t
INNER JOIN sys.indexes i ON t.object_id=i.object_id AND t.index_id=i.index_id
WHERE avg_fragmentation_in_percent>1.0 AND i.name NOT LIKE 'PK_%';
这个查询会返回所有平均碎片率大于1%的非主键索引,并根据碎片率的级别给出重建索引的建议。如果碎片率严重(大于20%),并且索引不是主键索引,则推荐重建该索引。
请注意,这个查询使用了sys.dm_db_index_physical_stats函数,它提供了索引碎片的实时信息。该查询还排除了主键索引,因为主键索引的碎片一般不会导致性能问题,除非表结构发生了显著变化。根据实际情况,可能需要调整阈值和排除条件。
- 注:可以参考这篇文章研究关于索引优化的相关知识,:mssql 优化之索引部分