优化广泛使用IN子句的Oracle SQL查询
我维护了一个应用程序,在该应用程序中,我试图优化使用多个IN子句的Oracle SQL查询。该查询现在是一个拦截器,因为它占用了近3分钟的执行时间,严重影响了应用程序性能。该查询是从Java代码(JDBC)调用的,如下所示:优化广泛使用IN子句的Oracle SQL查询,sql,oracle,optimization,Sql,Oracle,Optimization,我维护了一个应用程序,在该应用程序中,我试图优化使用多个IN子句的Oracle SQL查询。该查询现在是一个拦截器,因为它占用了近3分钟的执行时间,严重影响了应用程序性能。该查询是从Java代码(JDBC)调用的,如下所示: Select disctinct col1,col2,col3,.. colN from Table1 where 1=1 and not(col1 in (idsetone1,idsetone2,... idsetoneN)) or (col1 in(idsettwo1,
Select disctinct col1,col2,col3,.. colN from Table1
where 1=1 and not(col1 in (idsetone1,idsetone2,... idsetoneN)) or
(col1 in(idsettwo1,idsettwo2,...idsettwoN))....
(col1 in(idsetN1,idsetN2,...idsetNN))
ID集是从不同的模式检索的,因此表1的column1和ID集之间不可能连接。ID集随着应用程序的使用而不断增长,目前它们的记录数超过10000条
如何开始优化此查询?您应该将所有项放入一个临时表中并显式联接:
Select your cols
from Table1
left join table_with_items
on table_with_items.id = Table1.col1
where table_with_items.id is null;
另外,distinct
表明您的业务逻辑或应用程序架构中存在问题。为什么有重复的ID?您应该摆脱这种差异。我真的怀疑“ID集是从不同的模式检索的,因此表1的第1列和ID集之间不可能进行连接。”当然,您可以连接这些表,只要您对其具有选择权限
无论如何,让我们假设这是不可能的,因为任何原因。一种解决方案是首先将所有条目插入嵌套表中,然后使用以下方法:
CREATE OR REPLACE TYPE NUMBER_TABLE_TYPE AS TABLE OF NUMBER;
Select disctinct col1,col2,col3,.. colN from Table1
where 1=1
and not (col1 NOT MEMBER OF (NUMBER_TABLE_TYPE(idsetone1,idsetone2,... idsetoneN))
OR
(col1 MEMBER OF NUMBER_TABLE_TYPE(idsettwo1,idsettwo2,...idsettwoN))
关于元素的最大数量,我们说:因为嵌套表没有声明的大小,所以可以根据需要在构造函数中放入尽可能多的元素
我不知道你能把这句话看得多么严肃。你为什么在子句中使用多个
?他们都在同一列。将列表合并到一个列表中。如果使用不在
中,并且或
将需要时间,因此请尽量避免使用as Gordon Linoffsaid@GordonLinoffOracle最多可以接受列表中的1000个元素。您所说的“不同的模式”到底是什么意思?显然,可以连接来自不同模式的表:来自schema1.table1连接schema2.table2…
在Oracle中最好在不存在的外部连接非匹配查询上使用。您应该准备一个绑定变量成员为:1的语句,并直接用JDBC构造嵌套表并将其放入然后,它将流式传输到数据库,您不必构建/解析庞大的SELECT字符串。它会燃烧得很快!仅供参考-您拼错了DISTINCT
,但我从OP中看到了这一点