10046 事件 與 10053 事件

達芬奇的夢發表於2017-04-17

有同學一直向Maclean反應希望做一期10046 SQL trace的教程, 正好這幾天有空 我們就理一理。

為什麼我們要使用10046 trace?

10046 trace幫助我們解析 一條/多條SQL、PL/SQL語句的執行狀態 ,這些狀態包括 :Parse/Fetch/Execute三個階段中遇到的等待事件、消耗的物理和邏輯讀、CPU時間、執行計劃等等。

即10046 為我們揭示了 一條/多條SQL 的執行情況, 對於 以點入手的 SQL調優是很好的輔助工具,特別是在 10g之前沒有ASH的情況下。 但整體系統調優 不是10046 所擅長的, 10046 是 效能調優的起釘器 , AWR是效能調優 的錘子。

10046還能幫助我們分析 一些 DDL維護命令的內部工作原理, RMAN、Data Pump Expdp/Impdp等工具的緩慢問題等, 是研究 oracle 資料庫原理的 居家旅行必備良品。

10046 和SQL TRACE的區別?

10046 比 SQL_TRACE引數提供更多的控制選項, 更詳細的內容輸出, 一般Maclean只用10046 而不用sql_trace

10046 和10053 的區別?

10053 是最常用的Oracle 最佳化器optimizer 跟蹤trace, 10053 可以作為我們解析 最佳化器為什麼選擇某個執行計劃,其中的理由的輔助工具,但並不告訴我們這個執行計劃 到底執行地如何。

而10046 並不解釋 optimizer最佳化器的工作, 但它同樣說明了在SQL解析parse階段所遇到的等待事件和所消耗的CPU等資源,以及Execute執行和Fetch階段的各項指標。

簡而言之10046 告訴我們SQL(執行計劃)執行地如何, 10053告訴我們 最佳化器為什麼為這個SQL選擇某個執行計劃。

10046 TRACE的LEVEL:

不同的Level 對應不同的跟蹤級別

  • 1 啟用標準的SQL_TRACE功能 ( 預設) 包含了 SQL語句、響應時間、服務時間、處理的行數,物理讀和寫的數目、執行計劃以及其他一些額外資訊。 到版本10.2中 執行計劃寫入到 trace 的條件是僅當相關遊標 已經關閉時, 且與之相關的執行統計資訊是所有執行次數的總和資料。 到版本11.1中僅在每次遊標的第一次執行後將執行計劃寫入到trace , 執行統計資訊僅僅和這第一次執行相關
  • 4 比level 1時多出 繫結變數的 trace
  • 8 比level 1多出等待事件,特別對於9i中指出 latch free等待事件很有用,對於分析全表掃描和索引掃描也很有用
  • 12 比level 1 多出 繫結變數和 等待事件
  • 16 在11g中為每一次執行生成STAT資訊,僅在11.1之後可用
  • 32 比level 1少執行計劃
  • 64 和level 1 相比 在第一次執行後還可能生成執行計劃資訊 ; 條件是某個遊標在前一次執行的前提下 執行耗時變長了一分鐘。僅在 11.2.0.2中可用
  • Level 28 (4 + 8 + 16) 代表 同時啟用 level 4 、level 8、level 16
  • level 68 ( 64 + 4 ) 代表 同時啟用 level 64、level 4

設定的方法如下:

session 級別: alter session set events ’10046 trace name context forever,level X’;

system 級別 : alter system set events ’10046 trace name context forever,level X’;

針對非本會話的 某一個程式設定,如果你知道他的SPID 作業系統程式號

oradebug setospid SPID;

oradebug event 10046 trace name context forever, level X;

例如:

[oracle@vrh8 ~]$ ps -ef|grep LOCAL oracle 12421 12420 0 Aug21 ? 00:00:00 oracleG10R25 (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq))) oracle 12522 12521 0 Aug21 ? 00:00:00 oracleG10R25 (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq))) oracle 12533 1 0 Aug21 ? 00:00:00 oracleG10R25 (LOCAL=NO) oracle 15354 15353 0 Aug21 ? 00:00:08 oracleG10R25 (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq))) oracle 15419 15418 0 Aug21 ? 00:00:11 oracleG10R25 (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq))) oracle 16219 16218 0 Aug21 ? 00:00:00 oracleG10R25 (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq))) oracle 17098 17097 0 03:12 ? 00:00:00 oracleG10R25 (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq))) 要跟蹤 17098 這個程式 SQL> oradebug event 10046 trace name context forever, level 28; Statement processed. 從 sid 定位到 SPID 或者 ORAPID 的 查詢如下: SQL> select distinct sid from v$mystat; SID ---------- 141 SQL> select spid,pid from v$Process where addr=(select paddr from v$session where sid=141); SPID PID ------------ ---------- 17196 24 select spid,pid from v$Process where addr=(select paddr from v$session where sid=&SID) 如果只知道 ORA的PID 那麼也可以 oradebug setorapid 24; oradebug event 10046 trace name context forever, level 28;

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

相關文章