【问题标题】:Why is my query plan generating an index scan?为什么我的查询计划会生成索引扫描?
【发布时间】:2016-06-21 21:34:38
【问题描述】:

我有一个相对直接的查询:

    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 的正确索引,所以我不担心。

感谢您的帮助

【问题讨论】:

    标签: sql indexing


    【解决方案1】:

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

    • LEFT JOINON
    • 仅在 OR 运算符的一侧

    因此,它不能从使用以First 作为第一列的索引开始受益,因为从字面上看,该列中的 any 值可能是最终结果。

    【讨论】:

    • 有道理。在那种情况下,我真的没有一个具体的起点。重写查询会是更好的选择吗?
    • @user2124871 - 很难说什么时候一切都如此抽象。如果查询逻辑上正确,那么任何逻辑上正确的重写都可能具有完全相同的查询计划。
    • 所以我试图解决这个问题,但是,正如你所说,我得到了相同的查询计划。下一个解决方案是将其分解为单独的查询并连接结果。感谢您的意见 - 非常感谢。
    猜你喜欢
    • 2011-04-22
    • 2013-11-28
    • 2021-08-15
    • 2013-08-12
    • 2021-09-14
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 2021-01-31
    相关资源
    最近更新 更多