您好,登錄后才能下訂單哦!
有同學一直向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 對應不同的跟蹤級別
設置的方法如下:
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;
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。