2017-08-03 52 views
0

我們有一個小問題,我們查詢,這是一個.NET(4.5),通過應用System.Data.SqlClient.SqlCommand內部執行的一個。SQL服務器忽略索引並執行表掃描

的問題是,該查詢將要執行表掃描,這是非常緩慢的。因此,執行計劃展示了在這裏表掃描

截圖: enter image description here

細節: enter image description here

,使文本顯示,該過濾器Termine.DatumTermine.EndDatum導致表掃描。但爲什麼SQL-Server忽略索引? Termine.DatumTermine.EndDatum上有兩個索引。我們還嘗試添加第三個結合的數據EndDatum

的指標都是非聚集索引和這兩個領域都日期時間

+4

顯然'statistics'已經過時了!!更新統計再試運行查詢 –

+0

還發布查詢和索引的詳細信息,以獲得更準確的響應。在這裏分享執行計劃https://www.brentozar.com/pastetheplan/ –

+0

由於您嘗試兩個範圍查詢,兩個單獨的索引絕對無助於您。單一的組合索引*可能有用,但不能保證如此。 –

回答

0

它決定表掃描基於估計行數124844地方爲您的實際行是隻有831

優化認爲遍歷124844它會做得更好掃描表,而不是指數的尋求。

還需要檢查一下從指數選擇分開等欄目。如果您選擇了索引以外的其他列,則必須在執行索引查找後執行RID查找,但優化程序可能會考慮替代RID查找,因此它傾向於使用表掃描。

首先修復:更新的統計數據,並提供足夠的信息來優化器選擇更好的計劃。

0

你能否提供完整的查詢?我看到您正在拉動一系列範圍爲3個月的數據。如果這個範圍是數據集的很高百分比,那麼可能是因爲您試圖返回如此大比例的數據而進行掃描。如果索引不夠有選擇性,它就不會被拾取。

也...

你必須在過濾器的OR條款。從查看您提供的截圖中的謂詞可知,您可能會在兩個不同的過濾器周圍丟失()。這也可能導致掃描。

一項件事... OR條款有時會導致糟糕的計劃 - 一種替代方法是查詢拆分成每個組中都不同OR 2個UNIONED查詢。如果你提供查詢,我應該能夠給你一個重寫的版本來顯示這個。

+0

需要更多時間來得到它,但:http://pastebin.com/BPpAzVrJ – slxSlashi