Oracle存储过程 - NOT IN(SUBQUERY)消耗很多时间

时间:2012-06-07 10:20:42

标签: oracle plsql oracle-sqldeveloper

我有Oracle程序,它执行与以下相同的工作:

create or replace
PROCEDURE My_TEST_PROCEDURE
(
   cur out sys_refcursor
)
AS
BEGIN
  open cur for
   SELECT * FROM MYTABLE1
   WHERE MYTABLE1.SOMEROWNAME NOT IN 
        (SELECT SOMEROWNAME FROM MYTABLE2);
END My_TEST_PROCEDURE;

但是这两个表中有很多数据,每个表大约有300000行。因此需要花费大量时间才能完成。我该怎么做才能减少这段时间。我已经尝试声明一个sys_refcursor并将数据读入此游标,如下所示:

create or replace
PROCEDURE My_TEST_PROCEDURE
(
   cur out sys_refcursor
)
IS
DECLARE EXISTING_ITEMS SYS_REFCURSOR;
BEGIN
  OPEN EXISTING_ITEMS FOR
    SELECT SOMEROWNAME FROM MYTABLE2;
  open cur for
   SELECT * FROM MYTABLE1
   WHERE MYTABLE1.SOMEROWNAME NOT IN 
        EXISTING_ITEMS;
END My_TEST_PROCEDURE;

但这次出现ORA-00932错误。我该怎么办?

提前致谢。

2 个答案:

答案 0 :(得分:3)

使用如下所示的连接查询:

SELECT MYTABLE1.* 
FROM   MYTABLE1 
       left join MYTABLE2 
              ON MYTABLE1.SOMEROWNAME = MYTABLE2.SOMEROWNAME 
WHERE  MYTABLE2.SOMEROWNAME IS NULL 

答案 1 :(得分:1)

避免使用*,指定列名。

为什么你要使用光标?使用左外连接可以实现您正在做的事情,其中​​b.mycolumn为空

最好的问候。