會話的跟蹤以及執行計劃的獲取

andyann發表於2011-07-14
         在DBA診斷方法中,會話的跟蹤是比較重要的一個部分。如何獲取會話或者某些DML程式碼的執行計劃成為SQL優化重要工具,下面是日常常用3三種跟蹤方法,以及一些工具的使用。

1、AUTOTRACE功能
適用:當前會話跟蹤,當前螢幕輸出。
功能:檢視執行查詢的執行計劃和佔用的資源,使用的比較頻繁。

SET AUTOTRACE OFF                           -- 不生成AUTOTRACE 報告,這是預設模式
SET AUTOTRACE ON EXPLAIN           -- AUTOTRACE只顯示優化器執行路徑報告
SET AUTOTRACE ON STATISTICS     -- 只顯示執行統計資訊
SET AUTOTRACE ON                            -- 包含執行計劃和統計資訊
SET AUTOTRACE TRACEONLY          -- 同set autotrace on,但是不顯示查詢輸出

2、SQL_TRACE(Oracle的輔助診斷工具)

(1)全域性使用

在pfile/spfile引數檔案中指定:  sql_trace =true

SQL> alter system set sql_trace = true;

說明:全域性開啟SQL_TRACE會導致所有程式被跟蹤,包括後臺程式及所有使用者程式,會導致比較嚴重的效能問題,所以最好不要開啟此功能,預設關閉。

(2)當前會話使用:

SQL> alter session set timed_statistics = true;

SQL> alter session set sql_trace = true;

SQL>執行你的程式碼

SQL> alter session set sql_trace = false;

SQL>  @gettrcname

(3)跟蹤其他使用者程式:

使用包DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION進行跟蹤,
前提是需要手動找到會話的sid,serial#,這個方法就不多陳述了。

SQL> exec dbms_system.set_sql_trace_in_session(sid,serial#,true)

SQL> exec dbms_system.set_sql_trace_in_session(sid,serial#,false)

SQL>  @gettrcname

3、10046事件

10046事件是Oracle提供的內部事件,是對SQL_TRACE的增強.

10046事件可以設定以下四個級別:
1    -- 啟用標準的SQL_TRACE功能,等價於sql_trace
4    -- Level 1 + 繫結值(bind values)
8    -- Level 1 + 等待事件跟蹤
12  -- Level 1 + Level 4 + Level 8

(1)全域性設定。

引數檔案中新增:event="10046 trace name context forever,level 12"

(2)對當前session設定。

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

SQL> alter session set events '10046 trace name context forever, level 8';

SQL>執行你的程式碼

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

SQL>  @gettrcname

(3)對其他使用者session設定(呼叫DBMS_SYSTEM.SET_EV系統包):。

SQL> exec dbms_system.set_ev(sid,serial#,10046,8,'user');

SQL> exec dbms_system.set_ev(sid,serial#,10046,0,'user');

SQL>  @gettrcname
 
4、TKPROF 進行格式化。
跟蹤完後使用TKPROF命令進行檔案的格式化。

tkprof

5、runstats
tom kyte寫的測試工具用於比較程式碼執行計劃的異同。
有興趣的朋友可以下載程式碼下來嘗試一下。

附:linux下gettrcname程式碼
SELECT    a.VALUE
^X\t"T#b1Ep^#RK24070945       || b.symbol
U Y}I}ja,B1N*qa\G24070945       || c.instance_nameITPUB個人空間r7w!W P K q
       || '_ora_'
Ocg5^ NG)G;QFbZ24070945       || d.spidITPUB個人空間 a*Az}L
       || '.trc' trace_fileITPUB個人空間(r.H a"@@ {
  FROM (SELECT VALUEITPUB個人空間;dd:]j(L i8e
          FROM v$parameter
0gc1b/Ut24070945         WHERE NAME = 'user_dump_dest') a,
1A8T w2y9q24070945       (SELECT SUBSTR (VALUE, -6, 1) symbolITPUB個人空間H0wV"A/j:bL
          FROM v$parameterITPUB個人空間+DT*Ci)l8J v
         WHERE NAME = 'user_dump_dest') b,
N GPa.Q(o24070945       (SELECT instance_nameITPUB個人空間.RnA:S[2cKh
          FROM v$instance) c,ITPUB個人空間&Li.y;X M bGoh
       (SELECT spid
2j g)a6X#j6_d24070945          FROM v$session s, v$process p, v$mystat m
,j*M,s1i2|y:K+e9K24070945 WHERE s.paddr = p.addr AND s.SID = m.SID AND m.statistic# = 0) d;ITPUB個人空間S,u@U/_M7[!J

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24070945/viewspace-702223/,如需轉載,請註明出處,否則將追究法律責任。

相關文章