为什么我的查询计划会生成索引扫描?

时间:2016-06-21 13:29:20

标签: sql indexing

我有一个相对简单的查询:

    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 个答案:

答案 0 :(得分:1)

您使用表1中$A2列的唯一地方是在匹配失败并不一定是整个查询失败的地方

  • 位于First
  • ON
  • 仅在LEFT JOIN运算符的一侧

因此,使用OR作为第一列的索引无法启动受益,因为该列中的任何值可能是有效的最终结果的一部分。