在oracle中追加游标

时间:2010-03-23 18:43:55

标签: performance oracle cursor

昨天我问了question,得到了答案,但没有回答主要观点。我想减少进行MINUS操作所花费的时间。

现在,我正在考虑在5000块中执行MINUS操作,将每个迭代结果附加到游标并最终返回游标。 我有以下内容:

V_CNT           NUMBER :=0;
V_INTERVAL      NUMBER := 5000;

begin
  select count(1) into v_cnt from TABLE_1
while (v_cnt > 0)
loop
open cv_1 for
    SELECT  A.HEAD,A.EFFECTIVE_DATE,
    FROM   TABLE_1 A
    WHERE  A.TYPE_OF_ACTION='6' AND A.EFFECTIVE_DATE >= ADD_MONTHS(SYSDATE,-15)  
    AND A.ROWNUM <= V_INTERVAL
    MINUS
    SELECT  B.head,B.EFFECTIVE_DATE,
    FROM  TABLE_2 B
    AND B.ROWNUM <= V_INTERVAL

V_CNT := V_CNT - V_INTERVAL;
END LOOP; 
end;

但是,如您所见......在每次迭代中,光标都会被覆盖。如何更改代码,以便在每次迭代中它附加到cv_1光标而不是覆盖?

2 个答案:

答案 0 :(得分:1)

您尚未明确说明要求。 所以,我假设,你想在两张桌子A,B上做MINUS。 即你想在A中找到不在B中的元组。

假设这样,你写的逻辑并不完全正确,因为你在A和B的相应(5000长度)批次上做了一个MINUS。

例如:你的逻辑将在表A的第4000行返回一个元组,表示在表B的第6000行。

我建议您使用左外连接来满足您的需求。 (与Peter Lang的帖子相同)。 我认为这应该足以满足您的性能要求。

答案 1 :(得分:0)

这不是游标的工作方式,你必须将值存储在某种集合中。

您当前的查询会从Table_1获取5000个随机行,并删除从Table_2中选择的5000个随机行中也存在的行。


您是否尝试过不使用MINUS

据我了解查询,它应该产生与此相同的内容:

Select  a.head, a.effective_date,
From table_1 a
Left Join table_2 b On (b.head = a.head And b.effective_date = a.effective_date )
Where a.type_of_action='6' And a.effective_date >= ADD_MONTHS(SYSDATE,-15)  
  And b.head Is Null;

TABLE_1 (type_of_action, head, effective_date)TABLE_2 (head, effective_date)上设置复合索引可以帮助您提升效果。