一尘不染

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

sql

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

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

WHERE column_value = 'All'

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

WHERE column_value IN ('All')

如果只有一个值,SQL引擎会更改IN=吗?

MySQL和PostgreSQL有什么区别吗?


阅读 183

收藏
2021-03-17

共1个答案

一尘不染

这两个语句之间没有区别,并且优化器会将仅有一个元素的转换IN=when 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  |
-----------------------------------------------------

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

2021-03-17