2015-06-19 75 views
1

我有以下的PL/SQL過程:性能優化:每個VS FORALL

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個語句:一個用於表A,另一個用於表B.

這會大大提高我的程序性能嗎?

編輯: 我剛注意到這個程序一般來說非常慢!我嘗試處理10K條記錄,差不多30秒!一般問題在哪裏?

+1

你試過了嗎?看來你應該能夠自己回答這個問題。 –

+0

我是pl/sql的新手,這個腳本給了我,所以在挖掘之前我想知道它是否值得一試...(實際的程序比這個例子更復雜,有很多if分支機構等) – Phate

+0

這不取決於表T1,大小,列,索引,統計數據嗎? – kevinsky

回答

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

+0

...我愛你男人,我沒有別的話! 1秒處理約170k行!這太棒了! – Phate