我正在开发一个处理Oracle数据库中许多数据的应用程序
在某些情况下,我必须根据给定的条件列表获取许多对象,并使用SELECT ...FROM.. WHERE... IN...
,但IN
表达式只接受一个大小最多为1,000个项目的列表。
所以我使用OR
表达式,但正如我所观察到的那样 - 也许这个查询(使用OR
)比IN
慢(具有相同的条件列表)。这样对吗?如果是这样,如何提高查询速度?
答案 0 :(得分:27)
IN
比OR
更可取 - OR
是一个出名的糟糕表现者,可能导致其他需要在复杂查询中使用括号的问题。
比IN
或OR
更好的选择是加入包含您想要(或不想要)的值的表。此表可用于比较,临时或已存在于模式中。
答案 1 :(得分:7)
在这种情况下,我会这样做:
这意味着您可以将排序留给数据库并编写一个简单的查询。
答案 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。