0

在编写 SQL 查询时,例如

SELECT ID, NAME FROM USER_TABLE WHERE ID IN (1, 2, 10, 14, 15, ..., n)

解析器是否只是将其改写成这个?

SELECT ID, NAME FROM USER_TABLE WHERE ID = 1 
                                      OR ID =  2 
                                      OR ID =  10
                                      OR ID =  14
                                      OR ID =  15 
                                      ...
                                      OR ID =  n

或者它是否在后台做其他事情以提高效率?虽然手写是一场噩梦,而且我永远不会提倡这样做,但使用 IN 而不是像这样的一系列 OR 条件是否有任何理论上的性能优势或打击?

4

2 回答 2

3

这取决于数据库。从逻辑上讲,IN被解释为ORs 的序列,但这并不意味着它是底层实现。

例如,MySQL 将排序一个常量列表并使用二进制搜索来查找匹配项。这与一系列ORs 完全不同。

于 2018-12-25T14:57:08.323 回答
1

根据规范(例如 SQL92),x IN (a, b, c)描述为:

8.4  <in predicate>

[...]

4) The expression
     RVC IN IPV
   is equivalent to
     RVC = ANY IPV

和:

8.7  <quantified comparison predicate>

[...]

<quantified comparison predicate> ::=
     <row value constructor> <comp op> <quantifier> <table subquery>

<quantifier> ::= <all> | <some>

<all> ::= ALL

<some> ::= SOME | ANY

[...]

   c) If the implied <comparison predicate> is true for at least
     one row RT in T, then "R <comp op> <some> T" is true.

最后一行似乎表明x IN (a, b, c)应该提供与x = a OR x = b OR x = c. 然而,规范并没有规定 RDBM 应该如何实现该行为,它可能因 RDBM 而异。

以下帖子包含一些有趣的观察结果:

SQL Server 似乎为 MySQL 以不同方式处理它们生成相同x IN (...)的执行计划。x = ... OR x = ...

于 2018-12-25T15:36:22.267 回答