Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
优化广泛使用IN子句的Oracle SQL查询_Sql_Oracle_Optimization - Fatal编程技术网

优化广泛使用IN子句的Oracle SQL查询

优化广泛使用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,

我维护了一个应用程序,在该应用程序中,我试图优化使用多个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,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中看到了这一点