sql - 索引不适用于 Sql Server 中的 LIKE 和 NOT 运算符,这是一个神话吗

标签 sql sql-execution-plan

我在许多关于 Sql Server 的文章中看到,当我们编写查询时,我们应该避免在查询中使用 NOT 和 LIKE 运算符,因为索引没有应用于它。

例如。

  SELECT [CityId]
      ,[CityName]
      ,[StateId]
  FROM [LIMS].[dbo].[City]
  WHERE CityId NOT IN(1, 2)

我执行了上面的查询,发现索引被用来过滤记录。 以下是执行计划,清楚地显示了 Clustured Index 查找。这显然违背了我以前的想法和阅读。

enter image description here

我之前的理解是否错误?

最佳答案

索引不适用于 LIKE 和 NOT 运算符只是一个经验法则。 SQL Server(或任何有能力的 RDBMS)将在大多数情况下使用最好的算法。因此,如果可以手动查找索引,那么 SQL Server 也可以。

在您提供的特定示例中,尚不清楚查找是否比扫描更有效,因为无论如何都会返回大多数记录。因此,我不会深入了解该特定的执行计划。

底线:学习并了解数据库系统如何在内部组织数据和索引,这样您就不必依赖经验法则。

关于sql - 索引不适用于 Sql Server 中的 LIKE 和 NOT 运算符,这是一个神话吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9571835/

相关文章:

mysql - 在该月的最后一天获取上个月的数据。

sql-server - INT 列串联警告 : Type conversion in expression causes CardinalityEstimate warnings in execution plan

java - 如果我们关闭并重新打开准备好的语句,查询计划是否会重新计算?

postgresql - 简单的 WHERE EXISTS ... ORDER BY ... 查询在 PostgreSQL 中非常慢

oracle - 如何为整个存储过程生成解释计划

mysql - 计算每天从 mysql 中的一个巨大表中创建的行数

sql - 插入、更新和删除后的版本查询输出

c# - 如何在 mysql 中使用触发器将列的值从特定日期更新到仅针对唯一客户 ID 的日期

Mysql NOT IS NULL 行为

mysql - 查询从一个表和一个额外的列检索信息,这是另一个表的条件