SQL优化【基础10】 - 10046&10053

本文详细介绍了Oracle数据库中10046与10053事件的作用及使用方法,包括如何开启和关闭这些事件以收集SQL执行过程中的资源消耗信息和执行计划生成过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

version:11.2

--10046事件

作用:统计SQL执行过程中资源开销统计信息
使用方法:

一.  采用非oradebug方法 

1.针对本地会话
alter session set events '10046 trace name context forever,level n';  --开启,其中n为1,2,4,8
alter session set events '10046 trace name context off';  --结束

level 1:跟踪sql语句,包括解析、执行、提取、提交和回滚等。
level 4:包括变量的详细信息
level 8:包括等待事件
level 12:包括绑定变量与等待事件


举例:
SQL> alter session set events '10046 trace name context forever,level 12';

Session altered.

SQL> select status from t1 where object_id=1;

no rows selected

SQL> alter session set events '10046 trace name context off';

Session altered.


--获取spid,便于关联trace文件
SQL> @getspid

CURRENT_SPID
------------------------
3444

SQL> !more getspid.sql
select spid  current_spid from v$process where addr in (select paddr from v$session where sid in (select sid from 
v$mystat where rownum=1));

--在udump目录下根据spid获取
[oracle@11g3 trace]$ ls -tl |grep 3444
-rw-r----- 1 oracle oinstall     97671 Oct 11 10:58 oracle11gr3_ora_3444.trc

2.  针对其它会话:
EXEC DBMS_SYSTEM.set_ev(si=>182, se=>785, ev=>10046, le=>12, nm=>'');    --最后一个参数nm不要有空格
EXEC DBMS_SYSTEM.set_ev(si=>182, se=>785, ev=>10046, le=>0, nm=>'');

si:  v$session.sid
se: v$session.serial#
ev:  事件号码,如10046,10053
le:  level级别(1,2,4,8)
nm:为空''

 
二.  采用oradebug方法 
oradebug setospid 12345;
oradebug unlimit;
oradebug event 10046 trace name context forever, level 12;
oradebug event 10046 trace name context off;
oradebug tracefile_name

---------------------------------------------------------------------------------------------
--10053事件

=>与10046的获取方法类似
--获取单前会话
alter session set events '10053 trace name context forever,level 1';
alter session set events '10053 trace name context off';

--获取其它会话
EXEC DBMS_SYSTEM.set_ev(si=>182, se=>787, ev=>10053, le=>1, nm=>'');
EXEC DBMS_SYSTEM.set_ev(si=>182, se=>787, ev=>10053, le=>0, nm=>'');

--采用oradebug方法 
oradebug setospid spidxx;
--oradebug unlimit;
oradebug event 10053 trace name context forever,level 1;
oradebug event 10053 trace name context off;
oradebug tracefile_name

三.文件查看
1.--10046文件查看

(1).直接查看,能看到较为详细说明,但比较难看
(2).tkprof工具,后跟参数
--按逻辑读的降序排序,最耗逻辑读的排在最前面,并且执行用户为非sys用户
tkprof /u01/app/oracle/diag/rdbms/oracle11gr3/oracle11gr3/trace/oracle11gr3_ora_3486.trc  02.txt  sort=exeqry  sys=no
(3).这个跟通常的explan,set autot 的统计信息有何异同?
明显10046包含SQL执行的parse,exec,bind,fetch阶段的统计信息,而不是像explan是全部的时间,10046更详细更易于定位问题,


--下图看到解析花费在CPU上的时间为121982微秒,elapsed=245360微秒(全程)


2.--10053文件查看
=>必须是硬解析才能捕获
作用:10053是解释生成执行计划的过程,解释选择访问方式,连接方式原因,有几种连接方式。。。

--通过grep匹配可以看到SQL的连接顺序的组合有6种
*********************************
[oracle@11g3 trace]$ grep "Number of join permutations tried"  /u01/app/oracle/diag/rdbms/oracle11gr3/oracle11gr3/trace/oracle11gr3_ora_4532.trc
Number of join permutations tried: 6

四.  使用场景
10046:比如当一条SQL当成执行计划来看实际的执行时间为0.1秒,但全程的执行时间为4秒,那么剩下的3.9秒跑哪去了呢?,也就是10046关注于资源的消耗分布;
10053:接上面,发现硬解析的3.9秒大部份时间都耗在硬解上,那么就可以在10053上关注下是否连接方式过多造成,默认最大为2000,也就是10053关注于访问方式,连接方式的选择上
NAME                                     VALUE                     ISDEFAULT ISMOD      ISADJ
---------------------------------------- ------------------------- --------- ---------- -----
_optimizer_max_permutations              2000                      TRUE      FALSE      FALSE



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值