某Q友问题--启用了for each row触发器,如何提升forall操作性能

网友问题

问个问题,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/

请使用浏览器的分享功能分享到微信等