某Q友問題--啟用了for each row觸發器,如何提升forall操作效能

wisdomone1發表於2015-06-28

網友問題

問個問題,forall程式碼塊如果碰到for each row觸發器,效果會如何,會有影響嗎?
對於這類問題,有好的插入方法嗎,因為這樣插入太慢了?

測試結論

1,如果定義了for each row的觸發器,基於forall的PLSQL程式碼會作用於每條DML語句對應的記錄(表的每條記錄,因為FORALL是一條性處理表的多條記錄)
2,啟用了for each row的觸發器,forall的效能會受效能,但雖受影響,效能仍好於非forall的程式碼
3,觸發器對於forall及non forall PLSQL程式碼影響非常明顯
4,只能在插入時禁用觸發器(因為一般用FORALL肯定是大批次DML操作,而大批次操作一般執行基於OLTP肯定是在非業務高峰期間執行,比如晚上或週末),爾後啟用
  (如果大家有更好的辦法,歡迎交流)

測試明細

SQL> select * from v$version where rownum<=2;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production

SQL> conn scott/system
Connected.
SQL> create table t_all(a int,b int);

Table created.

SQL> create or replace procedure proc_forall
2 is
3 type a_tab is table of t_all.a%type index by binary_integer;
4 type b_tab is table of t_all.b%type index by binary_integer;
5 v_a a_tab;
6 v_b b_tab;
7 begin
8 for i in 1..3 loop
9 v_a(i):=i;
10 v_b(i):=i;
11 end loop;
12
13 forall i in 1..v_a.count
14 insert into t_all values(v_a(i),v_b(i));
15 commit;
16 end;
17 /

Procedure created.

啟用for each row觸發器
04:25:33 SQL> alter trigger trc_t_all enable;

Trigger altered.

Elapsed: 00:00:00.09
04:25:35 SQL>
04:27:14 SQL>
04:27:15 SQL>
04:27:15 SQL>
04:27:15 SQL> exec proc_forall;

PL/SQL procedure successfully completed.

Elapsed: 00:01:01.82

禁用for each row觸發器
04:28:34 SQL> alter trigger trc_t_all disable;

Trigger altered.

Elapsed: 00:00:00.13
04:30:26 SQL> exec proc_forall;

PL/SQL procedure successfully completed.

Elapsed: 00:00:03.04

啟用for each row
04:32:20 SQL> alter trigger trc_t_all enable;

Trigger altered.

Elapsed: 00:00:00.01
04:32:40 SQL> exec proc_non_forall;

PL/SQL procedure successfully completed.

Elapsed: 00:03:17.57

個人簡介

8年oracle從業經驗,具備豐富的oracle技能,目前在國內北京某專業oracle服務公司從事高階技術顧問。
服務過的客戶:
中國電信
中國移動
中國聯通
中國電通
國家電網
四川達州商業銀行
湖南老百姓大藥房
山西省公安廳
中國郵政
北京302醫院     
河北廊坊新奧集團公司

 專案經驗:
中國電信3G專案AAA系統資料庫部署及最佳化
中國聯通CRM資料庫效能最佳化
中國移動10086電商平臺資料庫部署及最佳化
湖南老百姓大藥房ERR資料庫sql最佳化專案
四川達州商業銀行TCBS核心業務系統資料庫模型設計和RAC部署及最佳化
四川達州商業銀行TCBS核心業務系統後端批處理儲存過程功能模組編寫及最佳化
北京高鐵訊號監控系統RAC資料庫部署及最佳化
河南宇通客車資料庫效能最佳化
中國電信電商平臺核心採購模組表模型設計及最佳化
中國郵政儲蓄系統資料庫效能最佳化及sql最佳化
北京302醫院資料庫遷移實施
河北廊坊新奧data guard部署及最佳化
山西公安廳身份證審計資料庫系統故障評估
國家電網上海災備專案4 node rac+adg 
          貴州移動crm及客服資料庫效能最佳化專案
          貴州移動crm及客服務資料庫sql稽核專案
          深圳穆迪軟體有限公司資料庫效能最佳化專案
聯絡方式:
手機:18201115468
qq   :   305076427
qq微博: wisdomone1
新浪微博:wisdomone9
qq群:275813900    
itpub部落格名稱:wisdomone1    http://blog.itpub.net/9240380/

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9240380/viewspace-1715195/,如需轉載,請註明出處,否則將追究法律責任。

相關文章