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';
--示例SQL
select 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: 627240799
select count(1)
from
test1 a ,test2 b where a.object_name=b.object_name
call 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 1
Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: SYS
Number of plan statistics captured: 1
Rows (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.00
SQL*Net message from client 2 0.00 0.00
********************************************************************************
四、总结
10046 事件是 Oracle 性能调优的核心工具,通过灵活设置跟踪级别、结合分析工具及动态视图,可深入剖析 SQL 执行细节。在生产环境中需谨慎使用,结合 AWR/ASH 等工具形成完整诊断链条,以高效定位和解决性能问题。
🚀 更多数据库干货,欢迎关注【安呀智数据坊】
如果你觉得这篇文章对你有帮助,欢迎点赞 👍、收藏 ⭐ 和留言 💬 交流,让我知道你还想了解哪些数据库知识!
📬 想系统学习更多数据库实战案例与技术指南?
📊 实战项目分享
📚 技术原理讲解
🧠 数据库架构思维
🛠 工具推荐与实用技巧
立即关注,持续更新中 👇