我有一个相对直接的查询:
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
列的唯一地方是匹配失败不一定是整个查询失败的地方
- 在
LEFT JOIN
的ON
内 - 仅在
OR
运算符的一侧
因此,它不能从使用以 First
作为第一列的索引开始受益,因为字面上 任何 该列中的值可能成为最终结果的有效部分。
关于sql - 为什么我的查询计划生成索引扫描?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37945849/