【问题标题】:Index Fragmentation Percentage different from script vs. SSMS Client与脚本与 SSMS 客户端不同的索引碎片百分比
【发布时间】:2019-09-30 00:02:50
【问题描述】:

我们使用的是 SQL Server 2012(完全最新)。我们一直在使用以下脚本检查碎片级别,但我们得到的结果与 SSMS 客户端向我们显示的结果截然不同。有人可以阐明正在发生的事情以及值得信任的事情吗?

SELECT OBJECT_NAME(ind.OBJECT_ID) AS TableName,
ind.name AS IndexName, indexstats.index_type_desc AS IndexType,
indexstats.avg_fragmentation_in_percent
FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, NULL) indexstats
INNER JOIN sys.indexes ind 
ON ind.object_id = indexstats.object_id
AND ind.index_id = indexstats.index_id
WHERE indexstats.avg_fragmentation_in_percent > -1--You can specify the percent as you want
ORDER BY indexstats.avg_fragmentation_in_percent DESC

这是运行上述脚本的结果

这是通过 SSMS 客户端查看的结果

您可以看到结果大不相同。在聚集索引和非聚集索引上都观察到了这种情况。

如果重要,我们会定期更新统计信息,因此不确定发生了什么以及应该信任哪个

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    您调用sys.dm_db_index_physical_stats 时使用的参数集与 SSMS 使用的参数集不同。

    当您调用此函数时,您指定一个mode=NULL 参数,它与mode='LIMITED' 相同。如果您使用 SQL Profiler 观看 SSMS,您可以看到它提供了一个 mode='SAMPLED' 参数,例如:

    select partition_number as PartitionNumber,
        index_type_desc as IndexType,
        index_depth as Depth,
        avg_fragmentation_in_percent    as AverageFragmentation,
        page_count  as Pages,
        avg_page_space_used_in_percent  as AveragePageDensity,
        record_count as Rows,
        ghost_record_count  as GhostRows,
        version_ghost_record_count  as VersionGhostRows,
        min_record_size_in_bytes as MinimumRecordSize,
        max_record_size_in_bytes as MaximumRecordSize,
        avg_record_size_in_bytes as AverageRecordSize,
        forwarded_record_count as ForwardedRecords
    from sys.dm_db_index_physical_stats(11, 730589791, 1, NULL, 'SAMPLED')
    

    根据Scanning Modes(强调我的):

    LIMITED 模式是最快的模式,扫描的页面数量最少。对于索引,只扫描 B 树的父级页面(即叶级以上的页面)。对于堆,会检查关联的 PFS 和 IAM 页,并以 LIMITED 模式扫描堆的数据页。

    在 LIMITED 模式下,compressed_pa​​ge_count 为 NULL,因为数据库引擎只扫描 B 树的非叶页以及堆的 IAM 和 PFS 页。

    使用 SAMPLED 模式获取compressed_pa​​ge_count 的估计值,使用 DETAILED 模式获取compressed_pa​​ge_count 的实际值。 SAMPLED 模式基于索引或堆中所有页面的 1% 样本返回统计信息。 SAMPLED 模式下的结果应视为近似值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-13
      • 1970-01-01
      • 2020-11-18
      • 1970-01-01
      • 2010-11-08
      相关资源
      最近更新 更多