我手边没有“解释计划”。你能帮忙说出以下哪项更有效吗?
选项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')
答案 0 :(得分:6)
这是一个类似的问题: IN vs OR of Oracle, which faster?
看看OMG小马给出的答案,他建议IN
比OR
更优化。
还有这个问题: 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