1

非常に大きなテーブルがあり、毎日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インデックスが選択されます。1SQL Serverが、データがない場合にこれを想定するのはなぜですか?より合理的なものを使用するように指示する方法はありますか?

日付を少し前の日付に置き換えると、ヒストグラムに統計が存在し、推定行数は約7000になります。

4

1 に答える 1

4

プラン ガイドを使用して、特定のクエリ プランを使用するようオプティマイザーに指示できます。これは、ヒントを追加するために変更できない生成されたクエリに適しています。

于 2012-10-04T08:57:01.013 に答える