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函数,它提供了索引碎片的实时信息。该查询还排除了主键索引,因为主键索引的碎片一般不会导致性能问题,除非表结构发生了显著变化。根据实际情况,可能需要调整阈值和排除条件。

posted @ 2024-11-06 11:04  shanzm  阅读(3)  评论(0编辑  收藏  举报
TOP