SQL Server のクエリの実行状況に影響する要素として統計情報があります。
統計情報はテーブル内のデータのサンプリングとなり、この情報を使用してどのようなクエリの実行プランを使用すればよいのかを決定していきます。
本番環境と開発環境で実行時間に差が出る、タイミングによって実行時間に差が出る場合、
- インデックスの断片化状態の確認
- 統計情報の更新状況の確認
- 使用されているプランの確認
をすることがあるかと思います。
統計情報に関しては以下のようなクエリで確認をすることができます。
SELECT |
SQL Server の統計情報は [自動作成] [自動更新] が行われるのがデフォルトの状態ですが、自動更新に関しては SQL Server 2008 R2 SP1 で追加された トレースフラグ [2371] を使用しない場合、テーブルの母数の 20% 程度が更新されないと自動更新が行われませんので、データが増加すると実データと統計情報に乖離が発生し、想定していたインデックスが使われないことがあります。
そのため、データが多いテーブルに関しては手動 (UPDATE STATISTICS / sp_updatestats) で統計情報を更新することがあります。
# SQL Server 2005 以降では統計情報の自動非同期更新 (AUTO_UPDATE_STATISTICS_ASYNCHRONOUSLY) ができますので、統計情報更新中の同時実行性を重視したい場合はこのオプションの使用も検討できると思います。
現在、どのタイミングで作成された統計情報が使われているのかは定期的に確認をした方が良いかもしれないですね。