【问题标题】:In clause versus OR clause performance wiseIn 子句与 OR 子句的性能明智
【发布时间】:2013-02-26 09:35:52
【问题描述】:

我有一个查询如下:

select * 
from table_1 
where column_name in ('value1','value2','value3');

考虑到这样一个表中的数据可能以百万计,下面的重组会更好吗??

select * 
from table_1 where 
column_name = 'value1' 
or column_name = 'value2' 
or column_name ='value3';

select * 
from table_1 
where column_name = any ('value1','value2','value3');

如果可能的话,我还需要了解性能优势。

提前致谢

【问题讨论】:

  • IN 和 OR 在理论上是相同的...如果您认为它们不是您的测试所揭示的?你测试过吗?
  • 说真的..??我听说存在性能差异,但我无法获得更好的。
  • 优化器计算的解释计划中可能存在差异,这将解释性能差异。如果您的测试没有发现这样的问题,那么 specific 查询就没有这个问题。
  • 如果有任何区别,很可能是这样:开发人员更有可能将一千个值放入 IN 子句中,而不是剪切粘贴一千个 or column_name = 语句.

标签: sql performance oracle database-performance query-performance


【解决方案1】:

仅在 3 个值检查的情况下,查询无关紧要。

Oracle 将重新编写查询以匹配可用的最佳选项。

如果有更多的值并且过于动态,那么 in 子句或内部连接可能会更好。

最好保留当前的查询

【讨论】:

    【解决方案2】:

    第三种方式比“IN”或多个“WHERE”条件更快:

    select *
    from table_1 as tb1
    inner join table_2 as tb2
    where tb1.column_name = tb2.column_name
    

    此处的 table_2(或查询)需要在您的示例中的“IN”和“WHERE”条件中列出的值。

    【讨论】:

    • 正如我所说,where 子句 value1、value2、value3 中只有 3 个值。这些是最终的,我为什么要创建另一个表并进行连接,它会不会更慢..??
    • 如果相关,请将其添加到问题中,而不仅仅是评论。
    猜你喜欢
    • 2010-12-01
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-20
    • 2014-01-12
    • 2015-08-06
    • 1970-01-01
    相关资源
    最近更新 更多