Oracle-SQL查询优化-查询运行时间长



我有一个场景,其中客户数据在一个模式中创建,并推送到另一个模式进行业务操作。在某些情况下,数据不会被推送,所以我使用下面的查询来识别丢失的数据。但它一直在运行,不返回数据,因为这两个表都有超过500万条记录。如何优化并获得结果?

SELECT CUSTID FROM SCHEMA1.CUSTOMER WHERE CUSTID NOT IN(SELECT ID FROM SCHEMA2.CUST_TBL);

再添加一个筛选器后,查询响应是相同的。

SELECT CUSTID FROM SCHEMA1.CUSTOMER WHERE CUSTID NOT IN(SELECT ID FROM SCHEMA2.CUST_TBL WHERE CUST_TYPE=0);

CUSTID和ID是索引的、唯一的,并且不是空列。CUST_TYPE不为null,但未编制索引。也尝试使用/*+parallel(50)*/

Oracle版本:19c

您尝试过不存在吗。

SELECT CUSTID FROM SCHEMA1.CUSTOMER A WHERE NOT EXIST
(SELECT 1 FROM SCHEMA2.CUST_TBL B WHERE A.ID = B.ID );

Minus需要排序,所以效率不是很高。更好的方法是外部连接:

select custid
from SCHEMA1.CUSTOMER c1
left join SCHEMA2.CUST_TBL c2
on c1.custid = c2.id
where c2.id is null

如果您有足够的资源(CPU、IO、内存(,可以使用并行性来进一步提高性能。

minus集合运算符怎么样?

select custid from schema1.customer
minus
select id from schema2.cust_tbl;

最新更新