昨天我问了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
光标而不是覆盖?
答案 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)
上设置复合索引可以帮助您提升效果。