Oracle的SQL性能调优:许多OR vs IN()

5
我手上没有“解释计划”。你能帮我看看下面哪个更有效率吗?
选项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。 - givanse
4个回答

7
这是一个类似的问题:Oracle中IN和OR哪个更快? OMG Ponies提出,INOR更优化。
还有这个问题:SQL中WHERE子句中的IN和OR之间的区别 虽然它不是特定于数据库的,但从Oracle的角度来看,它有一些很好的答案。
就值得一提的是,使用IN更易于阅读,因此在长期支持方面更易于维护。这可能会影响你的选择,特别是如果(正如我所怀疑的那样)Oracle优化器以相同的方式处理它们。
然而,如果你的值列表非常大,那么你应该考虑使用完全不同的方法来检索结果。

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

1

Oracle优化器将把IN列表转换为OR链。这使您可以执行OR扩展转换,从而进一步优化查询。此外,它可能能够生成可加速查询的传递谓词。

在两个查询、结构或转换中,如果一切相等,使用IN或OR不会有任何区别。IN将被转换为OR链。


0

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

选择/*+ ordered use_nl(x) */ * 从pl/sql_table,view_abc x 其中x.string_col = pl/sql_table.value


但是提示和临时表可能会带来许多其他潜在问题。现在优化器需要理解另一个表。那个额外表的开销可能比从较小的查询字符串中减少解析时间还要大。如果优化器错误地估计了临时表,就会导致诸如不使用分区修剪之类的问题。如果性能是主要目标,那么您应该向优化器提供尽可能多的信息,例如硬编码大型文字。 - Jon Heller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接