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

时间:2011-11-21 16:04:17

标签: sql oracle performance

我手边没有“解释计划”。你能帮忙说出以下哪项更有效吗?

选项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')

4 个答案:

答案 0 :(得分:6)

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

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

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

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

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

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