您想要做的是对与您的特定表有关的索引碎片进行持续分析。以下查询将显示特定对象中所有索引的每个索引的平均碎片,这些索引的 arecord_count
为 1000 或更大:
select
ps.index_id,
i.name,
ps.index_type_desc,
ps.alloc_unit_type_desc,
ps.index_level,
ps.avg_fragmentation_in_percent,
case
when ps.avg_fragmentation_in_percent < 5
then 'NO ACTION'
when ps.avg_fragmentation_in_percent >= 5
and ps.avg_fragmentation_in_percent < 30
then 'REORGANIZE'
when ps.avg_fragmentation_in_percent >= 30
then 'REBUILD'
end as recommended_action
from sys.dm_db_index_physical_stats
(
db_id('AdventureWorks2012'),
object_id('Person.Address'),
default,
default,
'detailed'
) ps
inner join sys.indexes i
on ps.object_id = i.object_id
and ps.index_id = i.index_id
where ps.record_count >= 1000
Run Code Online (Sandbox Code Playgroud)
您可以将其处理成一个逻辑脚本,该脚本根据您的环境和您拥有的维护窗口大小按计划运行。一个好的经验法则是,5% 到 30% 的碎片需要重新组织索引,30% 或更多的碎片应该重建。
编辑:我使用简单的CASE
逻辑来帮助进行经验法则计算。