統計情報がらみのトラブル †
統計情報の設定 †
小規模向け †
- 統計情報の自動更新 :True
- 統計情報の非同期更新:True
大規模向け †
統計情報の自動更新 †
自動更新の条件 †
- テーブル行数が0から非0に推移した
- 前回統計情報が更新された際のテーブル行数が500以下で、統計情報収集対象列が501回以上更新された場合
- 前回統計情報が更新された際のテーブル行数が501以上で、統計情報収集対象列が500+(テーブル行数の20%)回以上変更された
- 一時テーブルの場合は、上述の基準に加え、テーブル行数が6行を超えた
統計情報の非同期更新 †
- 非同期自動更新のメリット
- オンライン系のシステム (OLTP) と相性がいい
- 統計を同期的に更新しないため、タイムアウトが発生する確率が減る
- 非同期自動更新のデメリット
- データウェアハウスなど大規模データをバッチで回すような場合に性能が劣化する
- シングルユーザモードの利用が出来なくなる
統計情報自動更新OFFでのシステム運用 †
- 統計情報の自動更新がONの状態で、オンライン中に統計情報の更新が発生すると、性能的に問題が出ることがある。
- しかし、統計情報の自動更新をOFFにした場合、結局、統計情報が実データと乖離した際に問題が発生する。
- 従って、統計情報更新のOFF運用は以下のようになると考える。
- サーバ・メンテナンス時間帯に統計情報の更新をONにして統計情報を更新する。
- STATS_DATE関数で、統計の最終更新日を確認できる。
- サーバ・メンテナンス時間帯に問題(乖離)を発見して手動更新する(難しい)。
統計情報に関するSQL †
最終更新日時・更新回数の確認 †
SELECT
OBJECT_NAME(dsp.object_id)
, dsp.object_id
, ss.name
, dsp.last_updated
, dsp.rows
, dsp.rows_sampled
, dsp.steps
, dsp.unfiltered_rows
, dsp.modification_counter
FROM
sys.stats AS ss
CROSS APPLY
sys.dm_db_stats_properties(ss.object_id, ss.stats_id) AS dsp
WHERE
OBJECT_SCHEMA_NAME(dsp.object_id, DB_ID()) <> 'sys'
統計情報更新 †
EXEC sp_updatestats;