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 で開く →

関連項目