【问题标题】:SQL performance tuning for Oracle Many OR vs IN () [duplicate]Oracle Many OR vs IN () 的 SQL 性能调整 [重复]
【发布时间】:2012-01-03 02:55:17
【问题描述】:

我手头没有“解释计划”。您能帮忙判断一下以下哪个更有效吗?

选项 1:

select ... 
    from VIEW_ABC 
    where STRING_COL = 'AA' 
       OR STRING_COL = 'BB' 
       OR STRING_COL = 'BB' 
       OR ...
       OR STRING_COL = 'ZZ'

选项 2:

select ... 
    from VIEW_ABC 
    where STRING_COL IN ('AA','BB',...,'ZZ')

【问题讨论】:

  • 这个问题对任何数据库都是开放的,不同的优化器会有不同的实现。该问题的公认答案特定于 MySQL。另一个投票率高的答案是关于 Oracle。

标签: sql oracle performance


【解决方案1】:

我假设优化器会将两个版本视为相同。 IN 实际上只是多个 OR 语句的语法简写。

【讨论】:

    【解决方案2】:

    这是一个类似的问题: IN vs OR of Oracle, which faster?

    看OMG Ponies给出的答案,他建议INOR更优化。

    还有这个问题: IN vs OR in the SQL WHERE Clause

    虽然它不是特定于数据库的,但从 Oracle 的角度来看,它有一些很好的答案。

    不管怎样,IN 的使用会更容易阅读,因此从长远来看更容易获得支持。仅此一项可能会影响您的选择,特别是如果(我怀疑)Oracle 优化器以相同的方式对待它们。

    但是,如果您的值列表非常大,那么您可能应该寻找一种完全不同的方法来检索结果。

    【讨论】:

      【解决方案3】:

      如果 String_Col 列上存在一个,优化器仍将使用和索引。 为了保持适当的 SQL 大小以帮助解析,因此不要让 Oracle 解析 250-500 个字符的字符串,最好将所有可能的值放在临时表或 pl/sql 表中,然后像这 -

      选择 /*+ 有序 use_nl(x) */ * 来自 pl/sql_table, view_abc x 其中 x.string_col = pl/sql_table.value

      【讨论】:

      • 但是提示和临时表可能会增加许多其他潜在问题。现在优化器需要理解另一个表。该额外表的开销可能大于从较小的查询字符串中减少的解析时间。如果优化器错误地估计临时表,可能会导致不使用分区修剪等问题。如果性能是主要目标,那么您应该向优化器提供尽可能多的信息,例如硬编码大型文字。
      【解决方案4】:

      Oracle 优化器会将 IN 列表转换为 OR 链。这允许您执行OR-expansion transformation 可以进一步优化您的查询。此外,它可能能够生成可加速查询的传递谓词。

      如果两个查询、构造或转换中的所有内容都相等,则使用 IN 或 OR 之间没有区别。 IN 将转换为 OR 链。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-06-04
        • 2011-09-24
        • 1970-01-01
        • 2010-10-21
        • 2017-11-29
        相关资源
        最近更新 更多