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

标签 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 中的 First 列的唯一地方是匹配失败不一定是整个查询失败的地方

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

因此,它不能从使用以 First 作为第一列的索引开始受益,因为字面上 任何 该列中的值可能成为最终结果的有效部分。

关于sql - 为什么我的查询计划生成索引扫描?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37945849/

相关文章:

sql - 使用 Django ORM 中的先前对象注释查询集

sql - 获取缺少答案的调查问卷列表

mysql - 选择仅用双反斜杠转义的单引号记录

r - 在 R 的 data.table 中按组查找行索引的最有效方法是什么?

django - 在一个字段上过滤并在另一个字段上排序时 Django 模型的最佳索引

php - Mysql/php - 是否可以使用循环但没有 key 更新表?

sql - Oracle 错误 : ORA-00905: Missing keyword

PHP:在单个查询中更新多个 MySQL 字段

sql - 使用索引按字符串前缀选择

使用 Straight_Join 的 MySQL 查询成本更低,但执行时间更长