【问题标题】:Differences between OR condition or IN condition in SQLSQL中OR条件和IN条件的区别
【发布时间】:2015-08-08 18:37:11
【问题描述】:

我想知道在 sql 中我有一个 WHERE 语句的句子在性能或资源使用方面有什么区别

WHERE VALUE IN (A,B,C .......)  

WHERE VALUE = A OR VALUE = B OR VALUE = C.....

我想知道这是因为在 Oracle 查询中我必须搜索与此值相关的所有信息。我无法创建临时表。我只是从外部来源收到它们。首先,我虽然将它们放在 IN 子句中一样简单。值的数量是可变的,但从不低于 3000。另一方面,我读到 Oracle 对某种条件的值数量有限制,但到目前为止我从未收到超过 4000。

【问题讨论】:

  • 完全没有区别
  • 我想这取决于您使用的数据库软件的类型。如果这真的与您相关,您应该使用 EXPLAIN 语句或类似语句来衡量它。然后你会看到解析器是否做得很好并且处理两者是否相同。并且:IN 具有明显的优势,您可以使用 sub select 而不是静态值或可变数量的值。
  • 你用的是什么关系型数据库?
  • 对此进行了很好的讨论,包括stackoverflow.com/questions/3074713/… 上的真实 MySQL 性能数据stackoverflow.com/questions/6514906/… 上也讨论了 Oracle 的 MS SQL Server 已在stackoverflow.com/questions/2110715/sql-server-select-in-vs-or 上讨论过
  • @rob 关于您已删除答案中的问题,一旦您获得 3k 代表,您可以投票关闭作为骗子。在没有关于 RDBMS 的信息的情况下,目前尚不清楚这些链接中的哪一个是最佳目标!

标签: sql conditional-statements where-clause


【解决方案1】:

完全没有区别。在内部,数据库引擎会将 IN 列表展平为 ORed 条件堆栈,例如

WHERE VALUE IN (A,B,C .......)  

会变平

WHERE VALUE = A OR VALUE = B ...

【讨论】:

  • 他们没有告诉我们数据库引擎。
  • @MartinSmith。确实如此,但在大多数 RDBMS 中都是如此;至少我知道MySQLSQL ServerNETEZZA
  • 另一个答案中的链接显示在 MySQL 中它们不一样。
  • 我不同意。从逻辑上讲,它们是相同的,但根据我的经验,优化器不会转换它。
【解决方案2】:

它们在逻辑上是相同的(因为它们产生相同的结果),但优化器只会对 OR 中的一个值使用索引(如果存在的话) - 实际上 使用索引(因为 O(log n) + O(n) = O(n))。

根据我的经验,在寻找提高查询性能的方法时,我做的第一件事就是将列上的 OR 转换为单个 IN(这通常效果很好)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-06
    • 1970-01-01
    • 2018-11-25
    • 1970-01-01
    • 2012-03-09
    • 2016-03-15
    • 2011-03-10
    相关资源
    最近更新 更多