統計情報の自動更新が ON の時には統計情報を手動で更新する必要はない?

 

神谷 雅紀
Escalation Engineer

 

統計情報の自動更新が ON に設定されている場合には、統計情報を手動で更新する必要は全くないか

統計情報の自動更新オプション (AUTO_UPDATE_STATISTICS または AUTO_UPDATE_STATISTICS_ASYNC) が ON に設定されている場合であっても、UPDATE STATISTICSsp_updatestats を実行して明示的に統計情報を更新する必要がある場合はあります

 

統計情報の自動更新はいつどのように行われるのか

おおよそテーブルの 20% に相当するデータが更新されると、そのデータの統計は自動更新の対象になります。この更新条件が満たされた状態で統計情報を参照する UPDATE, SELECT, DELETE または MERGE ステートメントが実行されると、AUTO_UPDATE_STATISTICS が ON の場合はそのステートメントの一部として統計情報が更新されます。AUTO_UPDATE_STATISTICS_ASYNC が ON の場合は、そのステートメントによって統計情報更新のための非同期実行タスクがポストされます。この場合、統計情報はそのステートメントとは無関係に更新され、そのステートメント自身は更新前の統計情報を参照します。

条件を満たすことになる更新系ステートメントの実行時に統計情報が更新される、もしくは、条件が満たされた時点でバックグラウンドタスクにより統計情報が更新されるといった誤解をしている方を稀に見かけますが、正しくは、前述のとおり、統計情報を更新するのは、条件が満たされた状態の統計情報を最初に参照しようとしたステートメントです。

自動更新が行われる詳しい条件については、以下の文書の「SQL Server 2005 における統計情報の維持」 および 「Maintaining Statistics in SQL Server 2008」を参照して下さい。

Microsoft SQL Server 2005 のクエリ オプティマイザが使用する統計情報

Statistics Used by the Query Optimizer in Microsoft SQL Server 2008

 

どのような場合に手動更新が必要か

これまでのサポート経験からは、以下のような場合には、統計情報の明示的な更新が必要になることが多いようです。

    • 統計情報の自動更新が実行されるためのしきい値には達しないまでも、データ分布に影響を与える量のデータ変更が行われた場合。
    • 全体のデータ分布には大きな影響は与えていないが、データ参照を行う処理が、追加変更されたデータのみを参照する場合。言い換えれば、データ変更後に、統計情報に含まれていないデータを対象とした処理が行われる場合。

例えば、商品販売時点で登録されるデータがあるとします。その日の終わりに、そのデータの集計が行われます。その集計時の検索条件は、登録日付が今日であること(WHERE 登録日付 = 今日) です。このテーブルは過去 1 ヶ月分のデータを持っているため、1 日の更新量がテーブル全体の 20% に達することはほとんどありません。そのため、統計情報が自動で更新されるのは数日に一度です。このような場合、統計情報上は、今日登録されたデータは存在していないことになります。今日登録されたデータはすべてヒストグラム (DBCC SHOW_STATISTICS WITH HISTOGRAM の実行結果) の範囲外です。1 日の集計処理が実行されると、存在しないと思われるデータに対する参照に最適な実行プランが選択されることになります。

※ 存在しないデータを参照するために最適な実行プランは存在しないため、SQL Server は、少なくとも 1 行は該当データが存在すると仮定して実行プランを生成します。