equal (=) 和 IN 具有一个文字值之间的性能差异
Performance differences between equal (=) and IN with one literal value
当我们使用等号且 IN 运算符具有相同值时,SQL 引擎有何不同?执行时间是否改变?
第一个使用等式检查运算符
WHERE column_value = 'All'
第二个使用 IN
运算符和单个值
WHERE column_value IN ('All')
如果只有一个值,SQL 引擎是否会将 IN
更改为 =
?
MySQL 和 PostgreSQL 有什么区别吗?
这两个语句之间没有区别,当 IN
中只有一个元素时,优化器会将 IN
转换为 =
。
虽然当您有这样的问题时,只需 运行 两个语句,运行 它们的执行计划并查看差异。在这里 - 你找不到任何东西。
在网上大搜之后,我在SQL上找到了一个document来支持这个(我假设它适用于所有的DBMS):
If there is only one value inside the parenthesis, this commend [sic] is equivalent to,
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 |
-----------------------------------------------------
如您所见,两者是相同的。这是在索引列上。未索引的列也是如此(只是完整 table 扫描)。
与单个值一起使用时没有区别。如果您检查上述两个查询的 table 扫描、索引扫描或索引查找,您会发现这两个查询之间没有区别。
Is there any difference for same in Mysql and PostgresSQL?
不,这两个引擎不会有任何区别(事实上,大多数数据库都是一样的,包括 SQL Server、Oracle 等 )。两个引擎都会将 IN
转换为 =
对于单个 IN 子句,没有区别..下面是使用 EMPS table 我有的演示..
select * from emps where empid in (1)
select * from emps where empid=1
执行计划中第一个查询的谓词:
[PerformanceV3].[dbo].[Emps].[empID]=CONVERT_IMPLICIT(int,[@1],0)
执行计划中第二个查询的谓词:
[PerformanceV3].[dbo].[Emps].[empID]=CONVERT_IMPLICIT(int,[@1],0)
如果 IN 子句中有多个值,最好将它们转换为联接
确实没有太大区别,但是如果您的 column_value 已编入索引,IN
运算符可能不会将其作为索引读取。
遇到过一次,慎重
授人以渔等。以下是如何亲自了解查询的变体:
mysql> EXPLAIN SELECT * FROM sentence WHERE sentence_lang_id = "AMH"\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: sentence
type: ref
possible_keys: sentence_lang_id
key: sentence_lang_id
key_len: 153
ref: const
rows: 442
Extra: Using where
让我们换一种方式试试:
mysql> EXPLAIN SELECT * FROM sentence WHERE sentence_lang_id in ("AMH")\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: sentence
type: ref
possible_keys: sentence_lang_id
key: sentence_lang_id
key_len: 153
ref: const
rows: 442
Extra: Using where
您可以阅读 here 如何解释 mysql EXPLAIN
请求的结果。现在,请注意我们得到了两个查询的相同输出:生成了完全相同的 "execution plan"。 type
行告诉我们查询使用了非唯一索引(在本例中为外键),ref
行告诉我们查询是通过将常量值与此进行比较来执行的指数.
换个角度说,rdbms 系统的要点之一是它们会为您重写查询,并为该查询和所有等效查询选择最佳执行计划。这意味着只要两个查询在逻辑上相同,就应该始终在给定的 rdbms 上生成相同的执行计划。
也就是说,许多查询是等效的(相同的结果集),但只是因为数据库本身不知道的约束,所以要小心这些情况(例如,对于数字为 1-6 的标志字段,db不知道 <3
与 in (1,2)
相同)。但归根结底,如果您只是考虑 and
和 or
语句的易读性,那么您编写它们的方式不会对性能产生影响。
当我们使用等号且 IN 运算符具有相同值时,SQL 引擎有何不同?执行时间是否改变?
第一个使用等式检查运算符
WHERE column_value = 'All'
第二个使用 IN
运算符和单个值
WHERE column_value IN ('All')
如果只有一个值,SQL 引擎是否会将 IN
更改为 =
?
MySQL 和 PostgreSQL 有什么区别吗?
这两个语句之间没有区别,当 IN
中只有一个元素时,优化器会将 IN
转换为 =
。
虽然当您有这样的问题时,只需 运行 两个语句,运行 它们的执行计划并查看差异。在这里 - 你找不到任何东西。
在网上大搜之后,我在SQL上找到了一个document来支持这个(我假设它适用于所有的DBMS):
If there is only one value inside the parenthesis, this commend [sic] is equivalent to,
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 |
-----------------------------------------------------
如您所见,两者是相同的。这是在索引列上。未索引的列也是如此(只是完整 table 扫描)。
与单个值一起使用时没有区别。如果您检查上述两个查询的 table 扫描、索引扫描或索引查找,您会发现这两个查询之间没有区别。
Is there any difference for same in Mysql and PostgresSQL?
不,这两个引擎不会有任何区别(事实上,大多数数据库都是一样的,包括 SQL Server、Oracle 等 )。两个引擎都会将 IN
转换为 =
对于单个 IN 子句,没有区别..下面是使用 EMPS table 我有的演示..
select * from emps where empid in (1)
select * from emps where empid=1
执行计划中第一个查询的谓词:
[PerformanceV3].[dbo].[Emps].[empID]=CONVERT_IMPLICIT(int,[@1],0)
执行计划中第二个查询的谓词:
[PerformanceV3].[dbo].[Emps].[empID]=CONVERT_IMPLICIT(int,[@1],0)
如果 IN 子句中有多个值,最好将它们转换为联接
确实没有太大区别,但是如果您的 column_value 已编入索引,IN
运算符可能不会将其作为索引读取。
遇到过一次,慎重
授人以渔等。以下是如何亲自了解查询的变体:
mysql> EXPLAIN SELECT * FROM sentence WHERE sentence_lang_id = "AMH"\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: sentence
type: ref
possible_keys: sentence_lang_id
key: sentence_lang_id
key_len: 153
ref: const
rows: 442
Extra: Using where
让我们换一种方式试试:
mysql> EXPLAIN SELECT * FROM sentence WHERE sentence_lang_id in ("AMH")\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: sentence
type: ref
possible_keys: sentence_lang_id
key: sentence_lang_id
key_len: 153
ref: const
rows: 442
Extra: Using where
您可以阅读 here 如何解释 mysql EXPLAIN
请求的结果。现在,请注意我们得到了两个查询的相同输出:生成了完全相同的 "execution plan"。 type
行告诉我们查询使用了非唯一索引(在本例中为外键),ref
行告诉我们查询是通过将常量值与此进行比较来执行的指数.
换个角度说,rdbms 系统的要点之一是它们会为您重写查询,并为该查询和所有等效查询选择最佳执行计划。这意味着只要两个查询在逻辑上相同,就应该始终在给定的 rdbms 上生成相同的执行计划。
也就是说,许多查询是等效的(相同的结果集),但只是因为数据库本身不知道的约束,所以要小心这些情况(例如,对于数字为 1-6 的标志字段,db不知道 <3
与 in (1,2)
相同)。但归根结底,如果您只是考虑 and
和 or
语句的易读性,那么您编写它们的方式不会对性能产生影响。