DBAtlas · 数据库运维图谱

统计信息健康状况:何时更新、变更了多少行

SQL Server维护

命令

USE [Musteri];
SELECT OBJECT_SCHEMA_NAME(s.object_id) AS schema_name,
       OBJECT_NAME(s.object_id)        AS table_name,
       s.name                          AS stats_name,
       s.auto_created, s.has_filter, s.no_recompute,
       sp.last_updated,
       sp.rows, sp.rows_sampled,
       CAST(100.0 * sp.rows_sampled / NULLIF(sp.rows, 0) AS DECIMAL(5,1))         AS sample_pct,
       sp.modification_counter,
       CAST(100.0 * sp.modification_counter / NULLIF(sp.rows, 0) AS DECIMAL(9,1)) AS modified_pct,
       CAST(CASE WHEN 500 + 0.20 * sp.rows < SQRT(1000.0 * sp.rows) THEN 500 + 0.20 * sp.rows
                 ELSE SQRT(1000.0 * sp.rows) END AS BIGINT)                       AS auto_update_threshold,
       sp.persisted_sample_percent
FROM   sys.stats s
  CROSS APPLY sys.dm_db_stats_properties(s.object_id, s.stats_id) sp
WHERE  OBJECTPROPERTY(s.object_id, 'IsUserTable') = 1
ORDER BY sp.modification_counter DESC;

SELECT name, is_auto_create_stats_on, is_auto_update_stats_on, is_auto_update_stats_async_on
FROM   sys.databases
WHERE  name = DB_NAME();

作用

为每个统计信息显示上次更新时间、采样率、自上次更新以来修改的行数,以及触发自动更新的阈值(兼容级别 130+ 为动态阈值)。

适用场景

用于估算行数与实际行数差距很大的执行计划、大量数据加载之后,或检查统计信息维护作业是否有效时。

注意

该阈值公式适用于兼容级别 130+(MIN(500 + 20%, SQRT(1000 x rows)));较低的兼容级别使用 20% + 500 规则。从未更新过的统计信息(空表)返回 NULL。sample_pct 较低的倾斜列可能需要 FULLSCAN 或 PERSIST_SAMPLE_PERCENT。只读查询;安全。

在 DBAtlas 中打开 →

相关内容