Oracle的OR vs OR,哪个更快?

时间:2011-06-29 01:38:33

标签: sql performance oracle

我正在开发一个处理Oracle数据库中许多数据的应用程序 在某些情况下,我必须根据给定的条件列表获取许多对象,并使用SELECT ...FROM.. WHERE... IN...,但IN表达式只接受一个大小最多为1,000个项目的列表。

所以我使用OR表达式,但正如我所观察到的那样 - 也许这个查询(使用OR)比IN慢(具有相同的条件列表)。这样对吗?如果是这样,如何提高查询速度?

4 个答案:

答案 0 :(得分:27)

INOR更可取 - OR是一个出名的糟糕表现者,可能导致其他需要在复杂查询中使用括号的问题。

INOR更好的选择是加入包含您想要(或不想要)的值的表。此表可用于比较,临时或已存在于模式中。

答案 1 :(得分:7)

在这种情况下,我会这样做:

  1. 创建一列全局临时表
  2. 使用您的外部来源列表填充此表(并快速 - 另一整个讨论)
  3. 通过将临时表连接到另一个表来进行查询(考虑动态采样,因为临时表不具有良好的统计数据)
  4. 这意味着您可以将排序留给数据库并编写一个简单的查询。

答案 2 :(得分:2)

我会质疑整个方法。 SP的客户端必须发送100000个ID。客户从哪里获取这些ID?无论如何,发送如此大量的ID作为proc的参数将会花费很大。

答案 3 :(得分:1)

如果使用主键创建表:

CREATE TABLE my_test (id NUMBER,
CONSTRAINT PK PRIMARY KEY (id));

并通过相同的SELECT运行带有多个IN值的查询,然后通过哈希值检索执行计划,得到的是:

SELECT STATEMENT
INLIST ITERATOR
INDEX                  RANGE SCAN

这似乎暗示当你有一个IN列表并且将它与PK列一起使用时,Oracle会在内部将列表保留为“INLIST”,因为处理它更有效,而不是将其转换为OR,如未索引表的情况。

我上面使用的是Oracle 10gR2。