等于 (=) 和具有一个文字值的 IN 之间的性能差异

新手上路,请多包涵

当我们使用等号并且 IN 运算符具有相同的值时,SQL 引擎有何不同?执行时间会改变吗?

第一个使用相等检查运算符

WHERE column_value = 'All'

第二个使用 IN 运算符和单个值

WHERE column_value IN ('All')

如果只有一个值,SQL 引擎是否会将 IN 更改为 =

MySQL 和 PostgreSQL 有什么不同吗?

原文由 Somnath Muluk 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.1k
2 个回答

这两个语句之间没有区别,当 IN 只有一个元素时,优化器会将 IN =

虽然当您有这样的问题时,只需运行两个语句,运行它们的执行计划并查看差异。在这里 - 你不会找到任何东西。

在网上大搜索之后,我找到了一个关于 SQL 的 文档 来支持这一点(我假设它适用于所有 DBMS):

如果括号内只有一个值,则此命令 [ sic ] 等价于,

>  WHERE "column_name" = 'value1
>
> ```

以下是 Oracle 中两个查询的执行计划(大多数 DBMS 会以相同的方式处理):

EXPLAIN PLAN FOR select * from dim_employees t where t.identity_number = ‘123456789’

Plan hash value: 2312174735

| Id | Operation | Name |

| 0 | SELECT STATEMENT | | | 1 | TABLE ACCESS BY INDEX ROWID| DIM_EMPLOYEES |

| 2 | INDEX UNIQUE SCAN | SYS_C0029838 |


对于 `IN()` :

EXPLAIN PLAN FOR select * from dim_employees t where t.identity_number in(‘123456789’);

Plan hash value: 2312174735

| Id | Operation | Name |

| 0 | SELECT STATEMENT | | | 1 | TABLE ACCESS BY INDEX ROWID| DIM_EMPLOYEES |

| 2 | INDEX UNIQUE SCAN | SYS_C0029838 |

”`

如您所见,两者是相同的。这是在索引列上。未索引的列也是如此(只是全表扫描)。

原文由 sagi 发布,翻译遵循 CC BY-SA 4.0 许可协议

只是为了添加一个不同的观点,rdbms 系统的主要观点之一是它们将为您重写您的查询,并为该查询和所有等效的查询选择最佳执行计划。这意味着只要两个查询在逻辑上相同,就应该始终在给定的 rdbms 上生成相同的执行计划。

话虽这么说,许多查询是等效的(相同的结果集),但仅仅是因为数据库本身不知道的约束,所以要小心这些情况(例如,对于数字 1-6 的标志字段,数据库不知道 <3in (1,2) 相同)。但归根结底,如果您只是考虑 andor 语句的易读性,那么您编写它们的方式不会对性能产生影响。

原文由 Adam Martin 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题