非常に大きなテーブルがあり、毎日1〜200万行がテーブルに追加されています。
このクエリでは:
SELECT jobid, exitstatus
FROM jobsData
WHERE finishtime >= {ts '2012-10-04 03:19:26'} AND task = 't1_345345_454'
GROUP BY jobid, exitstatus
Task
との両方にインデックスが存在しFinishTime
ます。
task
行数がはるかに少ないため、インデックスが使用されることを期待していました。私たちが目にする問題は、SQL ServerがFinishTime
タスクの代わりにインデックスを使用する不適切なクエリ実行プランを作成し、クエリに非常に長い時間がかかることです。
これは、終了時間の値がFinishTime
インデックスヒストグラムの外側にある場合に発生します。
統計は毎日/数時間更新されますが、クエリが最近の値に対するものである場合がまだ多くあります。
質問:この場合、推定実行プランで、の推定行数がであることがはっきりFinishTime
とわかります。1
そのため、FinishTime
インデックスが選択されます。1
SQL Serverが、データがない場合にこれを想定するのはなぜですか?より合理的なものを使用するように指示する方法はありますか?
日付を少し前の日付に置き換えると、ヒストグラムに統計が存在し、推定行数は約7000になります。