触发器引起DML性能大降亦可用10046捕获元凶SQL
来源:互联网 发布:室内设计网络培训 编辑:程序博客网 时间:2024/06/05 09:50
场景:一些触发器的滥用,造成SQL的DML性能大降,通过10046亦可捕获其中耗能SQL测试:--创建等待插入表T1SQL> create table t1 as select object_id,object_name from dba_objects where 1=2;Table created.--创建触发器遍历的表T2SQL> create table t2 ( 2 n1 number, 3 n2 number);Table created.--创建SEQ01,SEQ02序列create sequence seq02 start with 100000Sequence created.SQL> drop sequence seq01;Sequence dropped.SQL> create sequence seq01 start with 1;create sequence seq02 start with 100000;Sequence created.--插入到T2,构造10万行量SQL> SQL> SQL> SQL> begin 2 for i in 1..100000 loop 3 insert into t2 select seq01.nextval,seq02.nextval from dual; 4 end loop; 5 commit; 6 end; 7 /PL/SQL procedure successfully completed.--创建索引,避免遍历全表扫描SQL> create index idx_t2 on t2(n1,n2);Index created.--在待插入表T1上创建插入触发器SQL> create or replace trigger trig_t1 2 before insert on t1 3 for each row 4 declare 5 v_count number; 6 begin 7 if inserting then 8 select count(1) into v_count from t2 where :new.object_id between n1 and n2; 9 if v_count=0 then 10 :new.object_id:=1111; 11 end if; 12 end if; 13 end; 14 /Trigger created.--查看当前的SID=33,SPID=2791QL> select * from v$mystat where rownum=1; SID STATISTIC# VALUE---------- ---------- ---------- 33 0 0SQL> select spid from v$process where addr in (select paddr from v$session where sid=33);SPID------------------------2791--10046开始跟踪SQL> alter session set events '10046 trace name context forever,level 12';Session altered.--长时间运行好几分钟后人工被迫中断SQL> insert into t1 select object_id,object_name from dba_objects;insert into t1 select object_id,object_name from dba_objects *ERROR at line 1:ORA-01013: user requested cancel of current operationORA-06512: at "AIKI.TRIG_T1", line 5ORA-04088: error during execution of trigger 'AIKI.TRIG_T1'SQL> alter session set events '10046 trace name context off';Session altered.--tkprof格式化命令:按照最耗能SQL从大到小的顺序,过序系统信息[oracle@host11gr3 trace]$ tkprof learning_ora_2791.trc 02.txt sys=no sort=prsela,exeela,fchelaTKPROF: Release 11.2.0.3.0 - Development on Tue May 6 21:49:43 2014Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.[oracle@host11gr3 trace]$ more 02.txtTKPROF: Release 11.2.0.3.0 - Development on Tue May 6 21:49:43 2014Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.Trace file: learning_ora_2791.trcSort options: prsela exeela fchela ********************************************************************************count = number of times OCI procedure was executedcpu = cpu time in seconds executing elapsed = elapsed time in seconds executingdisk = number of physical reads of buffers from diskquery = number of buffers gotten for consistent readcurrent = number of buffers gotten in current mode (usually for update)rows = number of rows processed by the fetch or execute call********************************************************************************--可以看到此条SQL,即为我们要找的触发器中耗能SQL元凶!SQL ID: 69jfghdwc8c1n Plan Hash: 4191549303SELECT COUNT(1) FROM T2 WHERE :B1 BETWEEN N1 AND N2call count cpu elapsed disk query current rows------- ------ -------- ---------- ---------- ---------- ---------- ----------Parse 0 0.00 0.00 0 0 0 0Execute 39209 4.40 4.63 0 0 0 0Fetch 39209 352.13 355.49 223 2292086 0 39208------- ------ -------- ---------- ---------- ---------- ---------- ----------total 78418 356.54 360.12 223 2292086 0 39208Misses in library cache during parse: 0Optimizer mode: ALL_ROWSParsing user id: 90 (recursive depth: 1)Number of plan statistics captured: 1Rows (1st) Rows (avg) Rows (max) Row Source Operation---------- ---------- ---------- --------------------------------------------------- 1 1 1 SORT AGGREGATE (cr=2 pr=0 pw=0 time=92 us) 20 20 20 INDEX RANGE SCAN IDX_T2 (cr=2 pr=0 pw=0 time=38 us cost=2 size=2002 card=77)(object id 77026) --使用触发器需谨慎;
0 0
- 触发器引起DML性能大降亦可用10046捕获元凶SQL
- PL/SQL --> DML 触发器
- 比较SQL Server约束和DML触发器
- SQL Server 2005的DML触发器
- PL/SQL-->DML 触发器
- 【SQL Server学习笔记】DML触发器、DDL触发器
- 1.SQL Server DML触发器之AFTER触发器
- 4.SQL Server DML触发器--指定First和Last触发器
- 5.SQL Server DML触发器--嵌套和递归触发器
- 6.SQL Server DML触发器--INSTEAD OF触发器
- PL/SQL触发器3(使用DML触发器)
- DML触发器
- DML触发器
- DML触发器
- DML触发器
- sql高性能触发器
- 触发器错误引起sql语句执行出错
- 触发器二(DML触发器)
- 在linux上安装jdk
- HDU 1040
- Palindrome Number
- Eclipse设置项目/文件初始化编码,改变已有文件编码
- 敏捷开发中对进度的把握
- 触发器引起DML性能大降亦可用10046捕获元凶SQL
- jsp传到数据库中乱码的处理
- 线程的优先级
- linux下安装apche的安装
- Linux学习,第二天(文件权限),学习笔记
- 对象序列化
- dijkstra算法
- 自己使用popupwindow时遇到的
- VARIANT的简便介绍