li
  当前位置:主页 > 性能优化 > 文章内容
li
Oracle11新特性——PLSQL新特性(六) (2)
来源: http://yangtingkun.itpub.net/  作者: yangtingkun    时间:2008-01-26   阅读:5  
本文章共2874字,分2页,当前第2页,快速翻页:
 

1 T
2 T_LONG
3 T_LONG_LOG
4 T_SESSION
5 T_SESSION_STAT

SQL> SELECT * FROM T_LONG_LOG;

ID COMMENTS
---------- ----------------------------------------
1 T
2 T_LONG
3 T_LONG_LOG
4 T_SESSION
5 T_SESSION_STAT

对比一下就可以看出,使用COMPOUND触发器要比建立三个触发器加一个包要简化很多,而且初始化,处理,清除等所有的步骤都在一起,也不容易出错。

而且由于COMPOUND所有的代码可以集中在一起,现在很多操作可以批量处理,这样COMPOUND还可以提高性能。

现在仍然使用第一个例子,为T增加一张LOG表,对T表所有的INSERT都同时插入到LOG表中,对比一下COMPOUND TRIGGER和普通TRIGGER的性能差异:

SQL> CREATE TABLE T_LOG (ID NUMBER, NAME VARCHAR2(30));

表已创建。

SQL> TRUNCATE TABLE T;

表被截断。

下面建立两种不同的触发器,二者的功能一致,都是向T_LOG表中插入T表新插入的数据:

SQL> CREATE OR REPLACE TRIGGER TRI_COMPOUND FOR INSERT ON T DISABLE
2 COMPOUND TRIGGER
3 TYPE T_NUMBER IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
4 TYPE T_VARCHAR2 IS TABLE OF VARCHAR2(30) INDEX BY BINARY_INTEGER;
5 V_ID T_NUMBER;
6 V_NAME T_VARCHAR2;
7 AFTER EACH ROW IS
8 BEGIN
9 V_ID(V_ID.COUNT 1) := :NEW.ID;
10 V_NAME(V_NAME.COUNT 1) := :NEW.NAME;
11 END AFTER EACH ROW;
12
13 AFTER STATEMENT IS
14 BEGIN
15 FORALL I IN 1..V_ID.COUNT
16 INSERT INTO T_LOG VALUES (V_ID(I), V_NAME(I));
17 END AFTER STATEMENT;
18 END;
19 /

触发器已创建

SQL> CREATE OR REPLACE TRIGGER TRI_A_EACHROW AFTER INSERT ON T
2 FOR EACH ROW DISABLE
3 BEGIN
4 INSERT INTO T_LOG VALUES (:NEW.ID, :NEW.NAME);
5 END;
6 /

触发器已创建

两个触发器都处于DISABLE状态,向T表插入数据,然后依次ENABLE其中的一个触发器,重复插入操作,对比三次的性能:

SQL> INSERT INTO T SELECT ROWNUM, OBJECT_NAME FROM DBA_OBJECTS;

已创建68345行。

SQL> TRUNCATE TABLE T;

表被截断。

SQL> SET TIMING ON
IXDBA.NET社区论坛
SQL> INSERT INTO T SELECT ROWNUM, OBJECT_NAME FROM DBA_OBJECTS;

已创建68345行。

已用时间: 00: 00: 00.75
SQL> TRUNCATE TABLE T;

表被截断。

SQL> ALTER TRIGGER TRI_COMPOUND ENABLE;

触发器已更改

SQL> INSERT INTO T SELECT ROWNUM, OBJECT_NAME FROM DBA_OBJECTS;

已创建68345行。

已用时间: 00: 00: 05.59
SQL> TRUNCATE TABLE T;

表被截断。

SQL> TRUNCATE TABLE T_LOG;

表被截断。

SQL> ALTER TRIGGER TRI_COMPOUND DISABLE;

触发器已更改

SQL> ALTER TRIGGER TRI_A_EACHROW ENABLE;

触发器已更改

SQL> INSERT INTO T SELECT ROWNUM, OBJECT_NAME FROM DBA_OBJECTS;

已创建68345行。

已用时间: 00: 00: 17.31

第一次不记录时间,为了避免CACHE的影响,后面三次记录时间,分别对应不启用触发器、启用COMPOUND触发器和启动AFTER EACH ROW触发器三种情况。对比三次的执行时间,可以看到使用了COMPOUNDFORALL批量处理功能,获得的性能提高还是非常明显的。



阅读更多内容<<上一页 · 1 · 2


  上一篇: Oracle11新特性——PLSQL新特性(...   下一篇: Oracle11新特性——在线操作功能...
li
 §相关评论  
 热点文章

·Resize datafile导致ASM Crash
·在Oracle10g RAC下新增ASM磁盘
·ORACLE SQL性能优化系列 (一)
·oracle性能调优:管理oracle日志
·oracle RAC环境中系统时钟的调
·why:Rac的心跳线不支持交叉线?
·RAC的VIP及实例依赖关系:版本O
·如何启动DataGuard的备用数据库
·系统表空间IO错误 数据损坏处理
·不幸中的万幸:遭遇ORA-00600 [
·用ORACLE的高级复制实现内外网
li
 编辑推荐
·Resize datafile导致ASM Crash
·在Oracle10g RAC下新增ASM磁盘
·ORACLE SQL性能优化系列 (一)
·oracle性能调优:管理oracle日志
·oracle RAC环境中系统时钟的调
·why:Rac的心跳线不支持交叉线?
·RAC的VIP及实例依赖关系:版本O
·如何启动DataGuard的备用数据库
·系统表空间IO错误 数据损坏处理
·不幸中的万幸:遭遇ORA-00600 [
·用ORACLE的高级复制实现内外网
li
 相关篇章
·Oracle11新特性——PLSQL新特性(...
·Oracle11新特性——PLSQL新特性(...
·Oracle11新特性——PLSQL新特性(...
·Oracle11新特性——PLSQL新特性(...
·Oracle11新特性——PLSQL新特性(...
·Oracle11新特性——PLSQL新特性(...
·Oracle11新特性——PLSQL函数缓存...
·Oracle11新特性——PLSQL函数缓存...
·Oracle11新特性——PLSQL函数缓存...
·Oracle11新特性——行列转换语句...
·Oracle11新特性——在线操作功能...
·Oracle11新特性——在线操作功能...
·Oracle11新特性——在线操作功能...
·Oracle11新特性——在线操作功能...
·Oracle11新特性——在线操作功能...
·Oracle11新特性——在线操作功能...
·Oracle11DATA GUARD实时应用加实...
·Oracle11新特性——在线操作功能...
·Oracle11新特性——分区功能增强...
·Oracle11新特性——分区功能增强...
 
li
设为首页 | 关于我们 | 技术服务 | 收藏本站 | 网站地图 | 联系方式 | 本站友情连接