使用 SQL Server,如果我导航到对象资源管理器中的一个表,转到它的索引,转到它的属性,然后查看碎片选项卡,顶部有 2 行对我来说,页面充满度百分比和总碎片百分比。
我也有一个偶尔用于索引信息的查询。修剪掉一些不相关的字段,这是查询:
SELECT t.name, ix.name, avg_fragmentation_in_percent
FROM sys.indexes AS ix
INNER JOIN sys.tables t ON t.object_id = ix.object_id
INNER JOIN sys.schemas s ON t.schema_id = s.schema_id
INNER JOIN sys.dm_db_index_physical_stats (db_id(), NULL, NULL, NULL, 'DETAILED') ps ON t.object_id = ps.object_id AND ix.index_id = ps.index_id
WHERE ix.index_id > 0
AND ix.name IS NOT NULL
当我运行这个查询时,我得到 3 列,前 2 列指向索引本身,对于这个查询,第三列是该索引的碎片百分比。
这 2 个数字通常非常接近,有时相同,但也可能经常不同。我遇到过差异很大的情况,在某些情况下超过 50%,但通常情况下它是 <1% 对 15-30%。查询结果几乎总是较高的百分比。
重建索引将使这两个数字完全或几乎为零(尽管不一定都为零)。所以我现在有 2 个数字用于索引上的碎片。根据sys.dm_db_index_physical_stats和Index Properties(FragmentationPage)的文档,两者都应该是索引的逻辑碎片,因此它们应该始终是相同的数字。对于应该相同的统计数据,我怎么会得到不同的数字?