統計情報を作成する際にはある程度のデータでサンプリングされた情報に基づいて作成がされます。
更新時の統計情報のサンプリングについて少しまとめてみたいと思います。
以前書いた 統計情報のサンプリングについて と内容はほとんど同じなのですが、統計情報の自動更新が行われた場合のサンプリングについて改めてまとめてみたいと思いまして。
DO’s&DONT’s #8: やってはいけないこと – インデックス再構築 (REBUILD) 後のインデックス統計情報更新 (UPDATE STATISTICS) に書かれていますが、インデックスの再構築をすると 100% のサンプリングで統計情報が作成されます。
以下はインデックスの再構築をした際のインデックスに対しての統計となりますが、Rows と Row Sampled が同一になっているため、100% のデータで統計情報が作成されています。
UPDATE STATISTICS サンプリングの設定をしないで統計情報を更新すると既定のサンプリングレートが使用され統計情報が更新されるため、100% より低いサンプリングでデータの集計が行われます。
sp_updatestats でも同様で手動更新をした場合はサンプリングの対象を指定しないと一部のデータのサンプリングにより統計情報が更新されます。
sp_updatestats と UPDATE STATISTICS の違いとしては最初に紹介した記事のコメントにも書かれていますが、sp_updatestats は rowmodctr を使用して更新されているかの判断をしているため、更新が全く行われていないインデックスに対しては統計情報の更新は行われず不要な変更が入らないという点があります。
それでは手動更新ではなく統計情報の自動更新が発生した場合のサンプリングはどうなるでしょう。
以下が統計情報の自動更新が発生した際のサンプリングの状態となります。
サンプリングを指定せずに手動で更新した時と同じで既定のサンプリングレートが使用されて更新されているのが確認できます。
手動更新の場合は RESAMPLE を使用すれば前回のサンプリングレートを使用して統計情報が更新されますが、統計情報の自動更新に関しては前回のサンプリングレートが使用されるということではないようです。
そのため、統計情報の自動更新では 100% のサンプルではない統計が作成されますのでこの点は意識をしておく必要がありそうですね。
一定の条件下でテストをしたい場合などは、統計情報の自動更新の発生は無効にし、100% の統計だけを使用するというようなことを検討する必要も出てきますので。