2016-06-21 11 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]%') 
     ) 

をしかし、私はクエリプランをチェックアウトする時はいつでも、私はインデックススキャンを行っています。

私は非クラスタ化インデックスが(TABLE1に)です:

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

Include: id 

なぜスキャン?私のインデックスはそれをカバーしていないのですか?私もtable2の正しいインデックスを持っているので、私はそこに心配していません。あなたは表1からFirst列を使用している

答えて

1

唯一の場所は試合を持っているために、障害が必ずしも全体のクエリ

  • ための故障ではありません場所にある任意の助け

    感謝ORオペレータの片側のみにLEFT JOIN

  • ON内部

したがって、の利益は、Firstのインデックスを最初の列として使用することはできません。文字列にはの値が最終結果の有効な部分である可能性があります。

+0

意味があります。その場合、具体的な出発点はありません。クエリを書き直すほうがよいでしょうか? – user2124871

+0

@ user2124871 - すべてがとても抽象的であることを伝えるのは難しいです。クエリが*論理的に正しい*の場合、論理的にも正しい再書き込みは、まったく同じクエリプランを持つことになります。 –

+0

私はこの問題を回避しようとしましたが、あなたが述べたように、私は同じクエリプランを持っています。次の解決策は、これを別のクエリに分解し、結果に参加させることです。あなたのご意見ありがとうございます - それを感謝します。 – user2124871

関連する問題