oracle 10046详解
如果你對oracle性能調優很感興趣或者比較專長,那么你對oracle的10046事件一定不會陌生。10046event是oracle用于系統性能分析時的一個最重要的事件。當激活這個事件后,將通知oracle kernel追蹤會話的相關即時信息,并寫入到相應trace文件中。這些有用的信息主要包括sql是如何進行解析,綁定變量的使用情況,會話中發生的等待事件等
10046event 可分成不同的級別(level),分別追蹤記錄不同程度的有用信息。對于這些不同的級別,應當注意的是向下兼容的,即高一級的trace信息包含低于此級的所有信息。
10046event的追蹤級別大致有:
level 1:跟蹤sql語句,包括解析、執行、提取、提交和回滾等。
level 4:包括變量的詳細信息
level 8:包括等待事件
level 12:包括綁定變量與等待事件
其中,level 1相當于打開了sql_trace
10046event的啟用和關閉:
前提條件:(先確保要event的會話環境符合條件)
1、必須確保timed_statistics為TRUE,這個參數可以在會話級上進行修改。
2、為了確保trace輸出能夠完整進行,還要調整此會話對trace文件大小的限制,一般將此限制取消,即將max_dump_file_size設置為UNLIMITED,或者設置為一個很大的闕值。
在滿足了上述條件后,就可以啟用10046event對會話進行后臺跟蹤了。
這里還有幾種方式來啟用10046event:
一種是在當前會話啟用event,可以利用alter session + 事件名稱 + level,
如:sql>alter session set event ‘10046 trace name context forever, level 12’;
另外一種是啟用別的會話進行event跟蹤,可以利用oracle提供的dbms_system來完成。
如:sql>exec dbms_system.set_ev(sid,serial#,10046,12,’’);
注意:
sql>exec dbms_system.set_sql_trace_in_session(sid,serial#,true);
相當于打開了sql_trace。
event的關閉:
可以在通過下面的語句來關閉當前會話的event:
sql>alter session set event ‘10046 trace name context off’;
也可以利用dbms_system包來關閉某個會話的event:
sql>execute dbms_system.set_ev(sid,serial#,0,’’);
這里應當值得一提的是,TRACE將消耗相當的系統資源,因此我們在使用TRACE的時候應當慎重。對于正式的系統,應當只在必要的時候進行TRACE操作,并且應當及時關閉。
當利用事件trace完當前或某個session后,接下來我們的工作就是找到oracle生成的trace了。Oracle的初始化文件中user_dump_dest參數的設置將決定trace文件的生成位置。
從trace文件中查找和發現有用的信息,然后尋找必要的性能調整點并進行相應的調整:
大部分情況下,通過10046事件trace到文件里的信息包含了此會話中存在的性能問題,可以根據trace到的等待事件、SQL語句執行情況以及綁定變量的使用情況來進行分析和查找。
oracle提供了一個工具tkprof來對trace文件進行格式的翻譯,以便trace文件中記錄的信息能夠被我們容易掌握和獲取。
基本用法:
?
tkprof tracefile outputfile [explain= ] [table= ] [print= ] [insert= ] [sys= ] [sort= ]
? ?table=schema.tablename? ?Use 'schema.tablename' with 'explain=' option.
? ?explain=user/password? ? Connect to ORACLE and issue EXPLAIN PLAIN.
? ?print=integer? ? List only the first 'integer' SQL statements.
? ?aggregate=yes|no
? ?insert=filename??List SQL statements and data inside INSERT statements.
? ?sys=no? ?? ?? ???tkprof does not list SQL statements run as user SYS.
? ?record=filename??Record non-recursive statements found in the trace file.
? ?sort=option? ?? ?Set of zero or more of the following sort options:
? ???prscnt??number of times parse was called
? ???prscpu??cpu time parsing
? ???prsela??elapsed time parsing
? ???prsdsk??number of disk reads during parse
? ???prsqry??number of buffers for consistent read during parse
?
例:
C:>tkprof D:oracleadminora9iudumpora9i_ora_2060.trc d:report.txt
???
??? 執行完后,在reprot.txt中查詢剛才的語句內容如下:
? ? select count(*)
?? from
?? sys_dept
??
??
?? call???? count?????? cpu??? elapsed?????? disk????? query??? current??????? rows
?? ------- ------? -------- ---------- ---------- ---------- ----------? ----------
?? Parse??????? 1????? 0.00?????? 0.01????????? 1???????? 31????????? 0?????????? 0
?? Execute????? 1????? 0.00?????? 0.00????????? 0????????? 0????????? 0?????????? 0
?? Fetch??????? 1????? 0.00?????? 0.01????????? 5????????? 7????????? 0?????????? 1
?? ------- ------? -------- ---------- ---------- ---------- ----------? ----------
?? total??????? 3????? 0.00?????? 0.03????????? 6???????? 38????????? 0?????????? 1
? ?
?? Misses in library cache during parse: 1
?? Optimizer goal: CHOOSE
?? Parsing user id: 62? ???
??
?? 通過設置tkprof的關鍵字[EXPLAIN = <username/password>],也可以在跟蹤文件中增加SQL語句的執行計劃:
??C:>tkprof D:oracleadminora9iudumpora9i_ora_2060.trc d:report.txt explain=test/test;??
??
??********************************************************************************
??
??select count(*)
??from
?? sys_dept
??
??
??call???? count?????? cpu??? elapsed?????? disk????? query??? current??????? rows
??------- ------? -------- ---------- ---------- ---------- ----------? ----------
??Parse??????? 2????? 0.00?????? 0.01????????? 1???????? 31????????? 0?????????? 0
??Execute????? 2????? 0.00?????? 0.00????????? 0????????? 0????????? 0?????????? 0
??Fetch??????? 2????? 0.00?????? 0.01????????? 5???????? 14????????? 0?????????? 2
??------- ------? -------- ---------- ---------- ---------- ----------? ----------
??total??????? 6????? 0.00?????? 0.03????????? 6???????? 45????????? 0?????????? 2
??
??Misses in library cache during parse: 1
??Optimizer goal: CHOOSE
??Parsing user id: 62?
??
??Rows???? Row Source Operation
??-------? ---------------------------------------------------
??????? 1? SORT AGGREGATE
?????? 16?? TABLE ACCESS FULL SYS_DEPT
???
?
?
小知識:
檢查當前會話的sql_trace狀態或級別:
SQL>set serveroutput on
1 declare i_event number;
2 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 過程已成功完成。
總結
以上是生活随笔為你收集整理的oracle 10046详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实例讲解如何通过Oracle成功发送邮件
- 下一篇: Oracle SQL Trace 和 1