SQL 服务器 2008 RTM (10.0.1600.22)
在表上运行典型的索引碎片报告:
SELECT OBJECT_NAME(i.OBJECT_ID) AS TableName,
i.name AS IndexName,
s.index_type_desc,
s.avg_fragmentation_in_percent,
s.fragment_count,
s.page_count,
s.record_count
FROM
sys.dm_db_index_physical_stats(DB_ID(), OBJECT_ID('RPT_XXX'), NULL, NULL, 'DETAILED') s
INNER JOIN
sys.indexes i ON i.OBJECT_ID = s.OBJECT_ID
AND i.index_id = s.index_id
and i.object_id = OBJECT_ID('RPT_XXX')
WHERE
s.avg_fragmentation_in_percent > 25
告诉我该表上的一个索引有 7 个碎片、7 页、大约 700 行和超过 28% 的碎片。但是,当我在 Management Studio 中查看索引存储属性时,我得到近 9000 页、超过 1200 万行和 0.01% 的碎片,这是预期的数字,因为表很大而且我刚刚重建和更新了索引表中的统计数据。
除了不受支持的 SQL Server RTM 版本中可能存在的错误之外,造成这种差异的原因可能是什么?
在我给其他人回答这个问题的机会之前,我发现了我的查询的问题。
dm_db_index_physical_stats()
, 在'DETAILED'
模式下运行时,为每个索引级别返回一行。在我的例子中,索引的叶级别确实有 0.01% 的碎片,因此被s.avg_fragmentation_in_percent > 25
标准过滤掉,在结果中只留下一个中间级别。可以说您只想查看索引的叶级来识别碎片,因此查询应如下所示:
正如 Aaron Bertrand 所建议的那样,标准
i.is_hypothetical = N'0'
来自于在跟踪中观察 Management Studio 生成的查询。编辑:从该分析中排除较小的索引也可能是有意义的,因为它们的碎片 a) 可能并不重要,b) 可能不会得到显着改善。