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