当我们使用等号和IN运算符具有相同的值时,SQL引擎有什么不同?执行时间会改变吗?
第一个使用等式判断运算符
WHERE column_value = 'All'
第二个使用IN
运算符和单个值
WHERE column_value IN ('All')
如果只有一个值,SQL引擎是否会将IN
更改为=
?
MySQL和PostgreSQL有什么不同吗?
当我们使用等号和IN运算符具有相同的值时,SQL引擎有什么不同?执行时间会改变吗?
第一个使用等式判断运算符
WHERE column_value = 'All'
第二个使用IN
运算符和单个值
WHERE column_value IN ('All')
如果只有一个值,SQL引擎是否会将IN
更改为=
?
MySQL和PostgreSQL有什么不同吗?
这两种说法没有区别,当IN
中只有一个元素时,优化者会将IN
转换为=
.
但是当你遇到这样的问题时,只需运行两个语句,运行它们的执行计划,并查看它们之间的差异.这里——你找不到.
在网上进行了大量搜索之后,我在SQL上找到了一个document来支持这一点(我认为它适用于所有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 |
-----------------------------------------------------
正如你所见,两者都是相同的.这是一个索引列.对于未编制索引的列也是如此(只是完整的表扫描).