Oracle的10046事件,可以跟蹤應用程式所執行的SQL語句,並且得到其解析次數.執行次數,CPU使用時間等資訊。這對我們分析、定位元據庫效能問題是非常有用的。
10046event是oracle用於系統效能分析時的一個最重要的事件。當啟用這個事件後,將通知oracle kernel追蹤會話的相關即時資訊,並寫入到相應trace檔案中。這些有用的資訊主要包括sql是如何進行解析,綁定變數的使用方式,會話中發生的等待事件等
10046event 可分成不同的層級(level),分別追蹤記錄不同程度的有用資訊。對於這些不同的層級,應當注意的是向下相容的,即高一級的trace資訊包含低於此級的所有資訊。
10046event的追蹤層級大致有:
level 1:跟蹤sql語句,包括解析、執行、提取、提交和復原等。
level 4:包括變數的詳細資料
level 8:包括等待事件
level 12:包括綁定變數與等待事件
其中,level 1相當於開啟了sql_trace
前提條件:
(先確保要event的會話環境符合條件)
1、必須確保timed_statistics為TRUE,這個參數可以在會話級上進行修改。
2、為了確保trace輸出能夠完整進行,還要調整此會話對trace檔案大小的限制,一般將此限制取消,即將max_dump_file_size設定為UNLIMITED,或者設定為一個很大的闕值。
在滿足了上述條件後,就可以啟用10046event對會話進行後台跟蹤了。
1、首先獲得spid、sid、serial#,machine為串連oracle的機器名
select b.spid,a.sid,a.serial#,a.machine from v$session a,v$process b where a.paddr =b.addr and a.sid = '159'
繼續往下看,就可以知道為什麼找到SPID了;
2、10046事件啟動
SQL>execute sys.dbms_system.set_ev(15,196,10046,1,'');
PL/SQL procedure successfully completed.
參數說明:
15:SID
196:SERIAL#
注意這裡必須以sysdba登入。
或者會話層級的跟蹤:
SQL> alter session set events '10046 trace name context forever ,level 12' ;
會話已更改。
3、在應用程式中執行對資料庫的操作
比如效能較差的一些查詢、插入、刪除操作等。
4、10046事件的關閉
SQL>execute sys.dbms_system.set_ev(15,196,10046,0,'');
PL/SQL procedure successfully completed.
或者對應上面的,在會話層級關閉
SQL> alter session set events '10046 trace name context off' ;
會話已更改。
5、獲得產生的追蹤檔案所在的目錄
SQL> select value from v$parameter where name = 'user_dump_dest';
轉到該目錄下可以看到產生了一個zftang_ora_596.trc檔案,此處的596即SPID的值。