数据表数据在百万量级的时候,使用下面的存储过程,运行时间是119s
因为过多的进行了commit操作。减少commit操作后,执行时间按61s。
使用forall命令后,可以将执行时间减到4s
关于forall,参考
declare
start_time date;
elapsed_sec int;
begin
start_time := sysdate;
for cur in ( select * from t_old) loop
insert into t values cur;
commit;
end loop;
elapsed_sec := (sysdate - start_time) * 86400;
dbms_output.put_line('elapsed_time ' || elapsed_sec || ' seconds');
end;
/
因为过多的进行了commit操作。减少commit操作后,执行时间按61s。
declare
start_time date;
elapsed_sec int;
begin
start_time := sysdate;
for cur in ( select * from t_old) loop
insert into t values cur;
end loop;
commit;
elapsed_sec := (sysdate - start_time) * 86400;
dbms_output.put_line('elapsed_time ' || elapsed_sec || ' seconds');
end;
/
使用批量绑定变量后,运行时间在40s左右
declare
start_time date;
elapsed_sec int;
cursor cur is select * from t_old;
type rec is table of t_old%rowtype;
recs rec;
begin
start_time := sysdate;
open cur;
while (true) loop
fetch cur bulk collect into recs limit 100;
for i in 1 .. recs.count loop
insert into t values recs (i);
end loop;
commit;
exit when cur%notfound;
end loop;
close cur;
elapsed_sec := (sysdate - start_time) * 86400;
dbms_output.put_line('elapsed_time ' || elapsed_sec || ' seconds');
end;
/
使用forall命令后,可以将执行时间减到4s
declare
start_time date;
elapsed_sec int;
cursor cur is select * from t_old;
type rec is table of t_old%rowtype;
recs rec;
begin
start_time := sysdate;
open cur;
while (true) loop
fetch cur bulk collect into recs limit 100;
forall i in 1 .. recs.count
insert into t values recs (i);
commit;
exit when cur%notfound;
end loop;
close cur;
elapsed_sec := (sysdate - start_time) * 86400;
dbms_output.put_line('elapsed_time ' || elapsed_sec || ' seconds');
end;
/
关于forall,参考
http://blog.csdn.net/leshami/article/details/7536926
http://yangtingkun.itpub.net/post/468/198828