我們有一個非常大的表,每天有1-2百萬行被添加到表中。SQL Server:當過濾器值超過索引直方圖範圍時使用錯誤索引
在此查詢:
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
索引。如果沒有數據,爲什麼SQL Server假定這是1
?有沒有辦法讓它使用更合理的東西?
當我們與前面有點更換日期,統計數據存在於直方圖和行的估計數是〜7000
我只是在這種情況下使用查詢提示來強制你想要的計劃。 –
查詢差異很大,因此很難知道使用哪個提示。我們如何處理FinishtTime索引期望行的錯誤估計?爲什麼發動機猜測它會是1?他不能拿平均水平的其他水桶嗎? – duduamar
@duduamar - 你怎麼知道這些查詢差異很大?你使用OP還是什麼? –