私はたくさんの行とたくさんの列を持つ非常に大きなテーブルを持っています(私はそれが悪いことを知っていますが、これは脇に置いておきましょう)。
具体的には、2つの列がありました- FinishTime, JobId
。1つ目は行の終了時刻で、2つ目はそのIDです(一意ではありませんが、ほぼ一意です。同じIDを持つレコードはごくわずかです)。
jobidにインデックスがあり、finishtimeにインデックスがあります。
私たちは常に行を挿入しますが、ほとんどは終了時間順に並べられています。また、各インデックスの統計も定期的に更新しています。
今問題に:
フィルタを使用してクエリを実行すると、jobid==<some id> AND finishtime > <now minus 1 hour>
このクエリには多くの時間がかかります。推定実行プランを表示すると、インデックスを超える方がはるかに優れているはずですが、プランはfinishtime
インデックスを超えることになっていることがわかります。jobid
インデックスの統計を見ると、このインデックスの統計を更新しなかったため、サーバーは過去1時間のジョブ数が1であると「考えている」ことがわかります。
フィルタを使用してクエリを実行するとjobid==<some id> AND finishtime > <now minus 100 days>
、SQL Serverは正しいインデックス(ジョブIDインデックス)を確認できるため、これはうまく機能します。
つまり、基本的に私の質問は、インデックス統計を常に更新しない場合(これには時間がかかる)、サーバーは最後のバケットを過ぎたレコードの数が1であると想定するのはなぜですか?
どうもありがとう