在oracle資料庫中,不是提交越頻繁越好。恰恰相反,批量提交可以得到更好的效能。這篇文章給大家簡單展示一下在oracle資料庫中逐行提交於批量提交兩者之間的效能差別。最後再給出一種可以極大改變效能的方法。
sec@ora10g> create table t_ref as select * from all_objects;
sec@ora10g> insert into t_ref select * from t;
220248 rows created.
sec@ora10g> /
sec@ora10g> /
sec@ora10g> /
sec@ora10g> /
sec@ora10g> /
440496 rows created.
我們的目標是將t_ref表中的資料全部插入到t中。
sec@ora10g> set timing on
sec@ora10g> declare
2 begin
3 for cur in (select * from t_ref) loop
4 insert into t values cur;
5 commit;
6 end loop;
7 end;
8 /
pl/sql procedure successfully completed.
elapsed: 00:03:12.77
逐行提交的情況下,一共用時3分12秒。
sec@ora10g> truncate table t;
table truncated.
sec@ora10g> declare
2 v_count number;
3 begin
4 for cur in (select * from t_ref) loop
5 insert into t values cur;
6 v_count := v_count + 1;
7 if v_count >= 100 then
8 commit;
9 end if;
10 end loop;
11 commit;
12 end;
13 /
pl/sql procedure successfully completed.
elapsed: 00:01:27.69
此時共用時1分27秒,大約是逐行提交方法一半的時間。由此可見,對於oracle應該盡量以批量提交的方式來完成工作。
sec@ora10g> declare
2 cursor cur is
3 select * from t_ref;
4 type rec is table of t_ref%rowtype;
5 recs rec;
6 begin
7 open cur;
8 while (true) loop
9 fetch cur bulk collect
10 into recs limit 100;
11 forall i in 1 .. recs.count
12 insert into t values recs (i);
13 commit;
14 exit when cur%notfound;
15 end loop;
16 close cur;
17 end;
18 /
elapsed: 00:00:09.75
此時我們僅僅使用了不到10秒的時間就完成了曾經需要幾分鐘才能完成的任務。
在oracle資料庫中,頻繁的commit會引起大量redo log的物理i/o,會極大的限制資料庫的效能。因此,為提高資料庫效能,盡可能的批量提交。
oracle有很多優秀的方法值得嘗試。
oracle批量提交
create or replace procedure p cust bossorder sync is 存放t iiss boss order back是否存在 v tablecount number 2 0 定義變數 type v bossorder row is table of t cust...
批量 獲取編輯列表及提交
批量編輯列表 批量編輯提交 public string edititemsallsubmit itemsqueryvo itemsqueryvo throws exception 2.springmvc註解開發 validation校驗 商品修改校驗 編輯提交 呼叫service更新商品資訊,頁面需...
spring ibatis 批量提交資料
在系統中,提取資料迴圈計算後,每次需要有大概3000條左右的資料需要提交到資料庫。以前在迴圈中單條插入,開始只有200條左右的資料,看不出效能上的問題,現在資料量增長了很多,所以需要對提交功能做一下優化。spring整合了ibatis的批量提交的功能,我們只要呼叫api就可以了 首先在你的dao中需...