Oracle 的 10046 事件是性能調優中最常用的工具之一,通過跟蹤會話的 SQL 執行細節,生成包含執行計劃、等待事件、綁定變量等信息的跟蹤文件,幫助定位性能瓶頸。以下是技術詳解:
一、10046 事件基礎
10046 是 Oracle 內部事件,通過設置不同級別收集不同詳細程度的信息:
- 級別 0:關閉跟蹤
- 級別 1:基礎跟蹤,包含 SQL 解析、執行、提取等階段的統計信息(等同SQL_TRACE=TRUE)
- 級別 4:在級別 1 基礎上增加綁定變量信息
- 級別 8:在級別 1 基礎上增加等待事件信息
- 級別 12:包含級別 4 和 8 的所有信息(綁定變量 + 等待事件)
關鍵參數:
- timed_statistics:必須設置為 TRUE 以收集時間相關統計信息
- max_dump_file_size:建議設置為 UNLIMITED 以避免文件大小限制
二、啟用與禁用
2.1 傳統set event方式
-- 開啟級別12跟蹤
ALTER SESSION SET EVENTS '10046 TRACE NAME CONTEXT FOREVER, LEVEL 12';
-- 可選:設置跟蹤文件標識便于查找
ALTER SESSION SET TRACEFILE_IDENTIFIER='10046_TRACE';
--執行目標SQL
。。。。
--關閉跟蹤
ALTER SESSION SET EVENTS '10046 TRACE NAME CONTEXT OFF';
2.2 oradebug方式
oradebug setmypid
alter session set events '10046 trace name context forever ,level 12';
--示例SQL
SELECT /*+ use_nl(a,b) */ count(1) FROM test1 a,test2 b WHERE a.created > sysdate-10 and a.object_id=b.object_id;
alter session set events '10046 trace name context off';
oradebug close_trace
oradebug tracefile_name
三、10046跟蹤SQL執行
3.1. 定位跟蹤文件
以 select count(1) from test1 a ,test2 b where a.object_name=b.object_name為示例
oradebug setmypid
alter session set events '10046 trace name context forever ,level 12';
--示例SQLselect count(1) from test1 a ,test2 b where a.owner=b.owner;
alter session set events '10046 trace name context off';
oradebug close_trace
oradebug tracefile_name
輸出trc文件
/u01/app/oracle/diag/rdbms/prod1/prod1/trace/prod1_ora_2188.trc
摘取關鍵內容
=====================
PARSING IN CURSOR #140235505604000 len=72 dep=0 uid=0 oct=3 lid=0 tim=1748307924927003 hv=233863389 ad='894cf078' sqlid='c4j52ac6z0y6x'select count(1) from test1 a ,test2 b where a.object_name=b.object_name
END OF STMT
PARSE #140235505604000:c=26303,e=27012,p=0,cr=169,cu=0,mis=1,r=0,dep=0,og=1,plh=627240799,tim=1748307924927001
EXEC #140235505604000:c=33,e=33,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,plh=627240799,tim=1748307924927168
WAIT #140235505604000: nam='SQL*Net message to client' ela= 3 driver id=1650815232 #bytes=1 p3=0 obj#=87363 tim=1748307924927210
FETCH #140235505604000:c=165208,e=168932,p=0,cr=1746,cu=0,mis=0,r=1,dep=0,og=1,plh=627240799,tim=1748307925096171
STAT #140235505604000 id=1 cnt=1 pid=0 pos=1 obj=0 op='SORT AGGREGATE (cr=1746 pr=0 pw=0 time=168929 us)'
STAT #140235505604000 id=2 cnt=157113 pid=1 pos=1 obj=0 op='HASH JOIN (cr=1746 pr=0 pw=0 time=237735 us cost=1244 size=202176216 card=1531638)'
STAT #140235505604000 id=3 cnt=86259 pid=2 pos=1 obj=87360 op='INDEX FAST FULL SCAN IDX_OWNER_OBJECT (cr=510 pr=0 pw=0 time=13086 us cost=138 size=6010884 card=91074)'
STAT #140235505604000 id=4 cnt=86270 pid=2 pos=2 obj=87363 op='TABLE ACCESS FULL TEST2 (cr=1236 pr=0 pw=0 time=27424 us cost=336 size=7664184 card=116124)'
WAIT #140235505604000: nam='SQL*Net message from client' ela= 188 driver id=1650815232 #bytes=1 p3=0 obj#=87363 tim=1748307925097399
FETCH #140235505604000:c=3,e=3,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=0,plh=627240799,tim=1748307925097445
WAIT #140235505604000: nam='SQL*Net message to client' ela= 1 driver id=1650815232 #bytes=1 p3=0 obj#=87363 tim=1748307925097467
WAIT #140235505604000: nam='SQL*Net message from client' ela= 785 driver id=1650815232 #bytes=1 p3=0 obj#=87363 tim=1748307925098263
CLOSE #140235505604000:c=8,e=8,dep=0,type=0,tim=1748307925098323
關于10046的參數意義,我們會放到故障處理分析中詳解。
3.2. 工具解析
由于裸數據閱讀不便,建議使用tkprof工具格式化
tkprof /u01/app/oracle/diag/rdbms/prod1/prod1/trace/prod1_ora_2188.trc output.txt
輸出
********************************************************************************SQL ID: c4j52ac6z0y6x Plan Hash: 627240799select count(1)
fromtest1 a ,test2 b where a.object_name=b.object_namecall count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.02 0.02 0 169 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 2 0.16 0.16 0 1746 0 1
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 4 0.19 0.19 0 1915 0 1Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: SYS
Number of plan statistics captured: 1Rows (1st) Rows (avg) Rows (max) Row Source Operation
---------- ---------- ---------- ---------------------------------------------------1 1 1 SORT AGGREGATE (cr=1746 pr=0 pw=0 time=168929 us)157113 157113 157113 HASH JOIN (cr=1746 pr=0 pw=0 time=237735 us cost=1244 size=202176216 card=1531638)86259 86259 86259 INDEX FAST FULL SCAN IDX_OWNER_OBJECT (cr=510 pr=0 pw=0 time=13086 us cost=138 size=6010884 card=91074)(object id 87360)86270 86270 86270 TABLE ACCESS FULL TEST2 (cr=1236 pr=0 pw=0 time=27424 us cost=336 size=7664184 card=116124)Elapsed times include waiting on following events:Event waited on Times Max. Wait Total Waited---------------------------------------- Waited ---------- ------------SQL*Net message to client 2 0.00 0.00SQL*Net message from client 2 0.00 0.00
********************************************************************************
四、總結
10046 事件是 Oracle 性能調優的核心工具,通過靈活設置跟蹤級別、結合分析工具及動態視圖,可深入剖析 SQL 執行細節。在生產環境中需謹慎使用,結合 AWR/ASH 等工具形成完整診斷鏈條,以高效定位和解決性能問題。
🚀 更多數據庫干貨,歡迎關注【安呀智數據坊】
如果你覺得這篇文章對你有幫助,歡迎點贊 👍、收藏 ? 和留言 💬 交流,讓我知道你還想了解哪些數據庫知識!
📬 想系統學習更多數據庫實戰案例與技術指南?
📊 實戰項目分享
📚 技術原理講解
🧠 數據庫架構思維
🛠 工具推薦與實用技巧
立即關注,持續更新中 👇