這是一個疑問而不是問題。我需要從一個表中選擇一些常用字段並將其插入到不同的表中。我已經完成了2種不同風格的代碼,但都使用BULK COLLECT。 哪個更好的選擇呢,還是除了這個之外還有別的辦法嗎?PLSQL性能問題
請在下面找到必要的細節。
程序(方法1):
create or replace procedure a2 is
cursor c1 is select id,address from emp1;
type t is table of c1%rowtype;
c t;
begin
open c1;
loop
fetch c1 bulk collect into c;
exit when c.count=0;
forall j in 1..c.count save exceptions
insert into empl1(id,address) values (c(j).id,c(j).address);
end loop;
commit;
exception when others then
for j in 1..sql%bulk_exceptions.count loop
dbms_output.put_line('The sql error is error occured');
end loop;
end a2;
/
運行上述程序和輸出:
declare
a number;
begin
dbms_output.put_line ('before procedure: ' || to_char(sysdate, 'HH24:MI:SS'));
a2;
dbms_output.put_line ('after procedure: ' || to_char(sysdate, 'HH24:MI:SS'));
end;
輸出:
before procedure: 23:44:48
after procedure: 23:45:47
PL/SQL procedure successfully completed.
所以上述過程把59秒插入34801020記錄。
現在請找到第二個程序。
程序(方法2):
create or replace procedure a3 is
cursor c1 is select id,address from emp1;
type t is table of c1%rowtype;
c t;
begin
select id,address bulk collect into c from emp1;
forall j in 1..c.count save exceptions
insert into empl1(id,address) values (c(j).id,c(j).address);
exception when others then
for j in 1..sql%bulk_exceptions.count loop
dbms_output.put_line('The sql error is error occured');
end loop;
end a3;
/
運行與輸出上面的過程。
declare
a number;
begin
dbms_output.put_line ('before procedure: ' || to_char(sysdate, 'HH24:MI:SS'));
a3;
dbms_output.put_line ('after procedure: ' || to_char(sysdate, 'HH24:MI:SS'));
end;
輸出:
before procedure: 23:47:57
after procedure: 23:48:53
PL/SQL procedure successfully completed.
此過程花了56秒插入34801020個記錄。
emp1表中的記錄總數。
SQL> select count(1) from emp1;
COUNT(1)
----------
34801020
因此我的問題:
了上述兩種方法是插入300萬條記錄到表中,請建議我,如果有任何其他更好的方法做上述過程的最佳方式插入。
這種類型的問題,更好地問關於[代碼審查](http://codereview.stackexchange.com/) –
1)不要。 2)簡單的問題是什麼,「insert into emp1 select ..從emp1「?超過3M的記錄,每個記錄的時間差異<0.08微秒 – OldProgrammer
如果你認爲CAPS在喊叫,那麼你就錯了,反正我不想在這一點上爭論,我們打算把這個程序放在一個調度程序中這樣它每隔一小時運行一次(查詢會改變)我不能在這裏添加項目代碼,如果我使用插入select的話會花費我2分多鐘 –