2012-10-04 46 views
1

我們有一個非常大的表,每天有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 

指標存在兩種TaskFinishTime

我們預計將使用task索引,因爲它的行數少得多。我們看到的問題是SQL Server創建一個錯誤的查詢執行計劃,該計劃使用FinishTime索引而不是任務,並且查詢花費很長時間。

當完成時間值超出FinishTime索引直方圖時會發生這種情況。

統計信息每天/幾個小時更新一次,但仍有很多情況下查詢的是最近的值。

問題:我們可以在估計執行計劃中清楚地看到FinishTime的估計行數是1,因此選擇了FinishTime索引。如果沒有數據,爲什麼SQL Server假定這是1?有沒有辦法讓它使用更合理的東西?

當我們與前面有點更換日期,統計數據存在於直方圖和行的估計數是〜7000

+0

我只是在這種情況下使用查詢提示來強制你想要的計劃。 –

+0

查詢差異很大,因此很難知道使用哪個提示。我們如何處理FinishtTime索引期望行的錯誤估計?爲什麼發動機猜測它會是1?他不能拿平均水平的其他水桶嗎? – duduamar

+0

@duduamar - 你怎麼知道這些查詢差異很大?你使用OP還是什麼? –

回答

3

可以使用Plan Guide指示優化器使用特定的查詢計劃你。這非常適合您無法修改以添加提示的生成查詢。

+0

這可能會有所幫助 - 謝謝!不過,由於當前查詢將其值作爲查詢文本的一部分而不是參數,因此它需要進行大量更改。任何想法爲什麼這些情況下估計的行數是「1」?將其設置爲更接近現有直方圖值或例如所有值的平均值 – nambar

+0

即使您將值指定爲標量而不是參數計劃指南仍然可以工作,因爲[自動參數化](http://msdn.microsoft.com/zh-cn/library/ms186219%28v= SQL.105%29.aspx)。 –