性能调整:对于每个vs forall

时间:2015-06-19 16:41:23

标签: oracle plsql

我有以下pl / sql程序:

create or replace procedure processData (a_date Date, r_offset Number, r_limit Number) as
begin
for r in (select * from (select a.*, ROWNUM rnum from (select* from TABLE1 T1 where T1.date=a_date) a 
 where rownum <= r_limit) where rnum >= r_offset) loop

 if (/*some condition on column values */) then
   /* insert into A*/
 else 
   /*insert into B*/
 end if; 

end loop;
end;

正如你所看到的那样。

我现在想知道用for-all语句执行此操作:这将涉及在表变量内部收集数据,然后在填充这些变量之后,执行2个forall语句:一个用于表A,一个用于表B.

这会大大改善我的节目表现吗?

编辑: 我只是注意到这个程序一般来说非常慢!我尝试处理10k记录,差不多花了30秒!一般问题在哪里?

1 个答案:

答案 0 :(得分:1)

为什么不使用纯SQL - conditional insert
http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_9014.htm
我敢打赌它会比任何PL / SQL循环快至少100倍,甚至是FORALL。

INSERT FIRST
WHEN /*some condition on column values */
    THEN INTO /* insert into A */
ELSE INTO /*insert into B*/
select * from (select a.*, ROWNUM rnum from (select* from TABLE1 T1 where T1.date=a_date) a 
 where rownum <= r_limit) where rnum >= r_offset

简单演示:http://sqlfiddle.com/#!4/d2019/1