10046event 漫步
2024-07-21 02:07:42
供稿:網(wǎng)友
10046event 漫步:
如果你對(duì)oracle性能調(diào)優(yōu)很感興趣或者比較專長(zhǎng),那么你對(duì)oracle的10046事件一定不會(huì)陌生。10046event是oracle用于系統(tǒng)性能分析時(shí)的一個(gè)最重要的事件。當(dāng)激活這個(gè)事件后,將通知oracle kernel追蹤會(huì)話的相關(guān)即時(shí)信息,并寫入到相應(yīng)trace文件中。這些有用的信息主要包括sql是如何進(jìn)行解析,綁定變量的使用情況,會(huì)話中發(fā)生的等待事件等
10046event 可分成不同的級(jí)別(level),分別追蹤記錄不同程度的有用信息。對(duì)于這些不同的級(jí)別,應(yīng)當(dāng)注意的是向下兼容的,即高一級(jí)的trace信息包含低于此級(jí)的所有信息。
?
10046event的追蹤級(jí)別大致有:
level 1:跟蹤sql語(yǔ)句,包括解析、執(zhí)行、提取、提交和回滾等。
level 4:包括變量的詳細(xì)信息
level 8:包括等待事件
level 12:包括綁定變量與等待事件
其中,level 1相當(dāng)于打開了sql_trace
?
10046event的啟用和關(guān)閉:
前提條件:(先確保要event的會(huì)話環(huán)境符合條件)
1、? 必須確保timed_statistics為true,這個(gè)參數(shù)可以在會(huì)話級(jí)上進(jìn)行修改。
2、? 為了確保trace輸出能夠完整進(jìn)行,還要調(diào)整此會(huì)話對(duì)trace文件大小的限制,一般將此限制取消,即將max_dump_file_size設(shè)置為unlimited,或者設(shè)置為一個(gè)很大的闕值。
在滿足了上述條件后,就可以啟用10046event對(duì)會(huì)話進(jìn)行后臺(tái)跟蹤了。
?
這里還有幾種方式來(lái)啟用10046event:
一種是在當(dāng)前會(huì)話啟用event,可以利用alter session + 事件名稱 + level,
如:sql>alter session set event ‘10046 trace name context forever, level 12’;
?
另外一種是啟用別的會(huì)話進(jìn)行event跟蹤,可以利用oracle提供的dbms_system來(lái)完成。
如:sql>exec dbms_system.set_ev(sid,serial#,10046,12,’’);
?
注意:
sql>exec dbms_system.set_sql_trace_in_session(sid,serial#,true);
相當(dāng)于打開了sql_trace。
?
event的關(guān)閉:
可以在通過(guò)下面的語(yǔ)句來(lái)關(guān)閉當(dāng)前會(huì)話的event:
sql>alter session set event ‘10046 trace name context off’;
?
也可以利用dbms_system包來(lái)關(guān)閉某個(gè)會(huì)話的event:
sql>execute dbms_system.set_ev(sid,serial#,0,’’);
?
這里應(yīng)當(dāng)值得一提的是,trace將消耗相當(dāng)?shù)南到y(tǒng)資源,因此我們?cè)谑褂胻race的時(shí)候應(yīng)當(dāng)慎重。對(duì)于正式的系統(tǒng),應(yīng)當(dāng)只在必要的時(shí)候進(jìn)行trace操作,并且應(yīng)當(dāng)及時(shí)關(guān)閉。
?
?
當(dāng)利用事件trace完當(dāng)前或某個(gè)session后,接下來(lái)我們的工作就是找到oracle生成的trace了。oracle的初始化文件中user_dump_dest參數(shù)的設(shè)置將決定trace文件的生成位置。
?
從trace文件中查找和發(fā)現(xiàn)有用的信息,然后尋找必要的性能調(diào)整點(diǎn)并進(jìn)行相應(yīng)的調(diào)整:
大部分情況下,通過(guò)10046事件trace到文件里的信息包含了此會(huì)話中存在的性能問(wèn)題,可以根據(jù)trace到的等待事件、sql語(yǔ)句執(zhí)行情況以及綁定變量的使用情況來(lái)進(jìn)行分析和查找。
?
oracle提供了一個(gè)工具tkprof來(lái)對(duì)trace文件進(jìn)行格式的翻譯,以便trace文件中記錄的信息能夠被我們?nèi)菀渍莆蘸瞳@取。
?
?
小知識(shí):
檢查當(dāng)前會(huì)話的sql_trace狀態(tài)或級(jí)別:
sql>set serveroutput on
2???????? declare i_event number;
3???????? begin
? 3? sys.dbms_system.read_ev(10046,i_event);
? 4? dbms_output.put_line(‘the session sql_trace level is: ‘||i_event);
? 5? end;
6???????? /
the session sql_trace level is: 12
?
pl/sql 過(guò)程已成功完成。
菜鳥學(xué)堂: