SE の雑記

金麦をメインにしたいと思いつつ Microsoft 製品の勉強内容を日々投稿

統計情報の更新状況の確認

leave a comment

SQL Server のクエリの実行状況に影響する要素として統計情報があります。
統計情報はテーブル内のデータのサンプリングとなり、この情報を使用してどのようなクエリの実行プランを使用すればよいのかを決定していきます。

本番環境と開発環境で実行時間に差が出る、タイミングによって実行時間に差が出る場合、

  1. インデックスの断片化状態の確認
  2. 統計情報の更新状況の確認
  3. 使用されているプランの確認

をすることがあるかと思います。

統計情報に関しては以下のようなクエリで確認をすることができます。

SELECT
    so.name
    , ss.name
    , ss.auto_created
    , ss.user_created
    , ss.no_recompute
    , STATS_DATE(ss.object_id, ss.stats_id)
FROM
    sys.objects AS so
    LEFT JOIN
        sys.stats AS ss
    ON
        ss.object_id = so.object_id
WHERE
    type = ‘U’
ORDER BY
    so.name

image

SQL Server の統計情報は [自動作成] [自動更新] が行われるのがデフォルトの状態ですが、自動更新に関しては SQL Server 2008 R2 SP1 で追加された トレースフラグ [2371] を使用しない場合、テーブルの母数の 20% 程度が更新されないと自動更新が行われませんので、データが増加すると実データと統計情報に乖離が発生し、想定していたインデックスが使われないことがあります。
そのため、データが多いテーブルに関しては手動 (UPDATE STATISTICS / sp_updatestats) で統計情報を更新することがあります。
# SQL Server 2005 以降では統計情報の自動非同期更新 (AUTO_UPDATE_STATISTICS_ASYNCHRONOUSLY) ができますので、統計情報更新中の同時実行性を重視したい場合はこのオプションの使用も検討できると思います。

現在、どのタイミングで作成された統計情報が使われているのかは定期的に確認をした方が良いかもしれないですね。

Written by masayuki.ozawa

4月 19th, 2012 at 11:52 am

Posted in SQL Server

Tagged with

Leave a Reply

*