2016-06-21 82 views
3

我有一個相對簡單的查詢:爲什麼我的查詢計劃會生成索引掃描?

SELECT o.id 
    FROM dbo.table1 o 
    LEFT JOIN dbo.table2 n (NOLOCK) 
     ON o.first = n.second and n.first = @Var1 
    WHERE 
     (o.fourth in (@Var4, @Var5) or o.fifth = @Var6) AND 
     (o.first = @Var1 or n.first = @Var1) AND 
     (
      o.second = @Var2 OR 
      o.second like (@Var2 + '[^a-zA-Z]%') OR 
      o.third like (@Var3 + '[^a-zA-Z]%') 
     ) 

但每當我檢查了查詢計劃,我做一個索引掃描。

非聚集索引我是(上表1):

First ASC, 
Fourth ASC, 
Fifth ASC, 
Second ASC, 
Third ASC 

Include: id 

爲什麼掃描?我的索引不覆蓋它嗎?我也有table2的正確索引,所以我並不擔心。

感謝所有幫助

回答

1

,你正在使用的First列從表1中的唯一的地方是在地方未能有符合未必是整個查詢

  • 失敗的LEFT JOIN
  • ON上的操作者OR的僅一側內

因此,受益不能從使用First作爲第一列的索引開始,因爲字段中該值的任何值可能是最終結果的有效部分。

+0

有道理。在那種情況下,我並沒有真正具體的出發點。重寫查詢會是更好的選擇嗎? – user2124871

+0

@ user2124871 - 很難說什麼時候一切都如此抽象。如果查詢是*邏輯上正確的*,那麼任何在邏輯上正確的重寫也可能具有完全相同的查詢計劃。 –

+0

所以我試圖解決這個問題,但是,就像你說的,我得到了相同的查詢計劃。下一個解決方案是將其分解爲單獨的查詢並加入結果。感謝您的輸入 - 非常感謝。 – user2124871

相關問題