SQL優化【基礎10】 - 10046&10053

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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章