Oracle获取执行计划之10046 技术详解

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方式

cpp 复制代码
-- 开启级别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方式

cpp 复制代码
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为示例

cpp 复制代码
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文件

cpp 复制代码
/u01/app/oracle/diag/rdbms/prod1/prod1/trace/prod1_ora_2188.trc

摘取关键内容

cpp 复制代码
=====================
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工具格式化

cpp 复制代码
tkprof /u01/app/oracle/diag/rdbms/prod1/prod1/trace/prod1_ora_2188.trc  output.txt   

输出

cpp 复制代码
********************************************************************************

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 等工具形成完整诊断链条,以高效定位和解决性能问题。


🚀 更多数据库干货,欢迎关注【安呀智数据坊】

如果你觉得这篇文章对你有帮助,欢迎点赞 👍、收藏 ⭐ 和留言 💬 交流,让我知道你还想了解哪些数据库知识!

📬 想系统学习更多数据库实战案例与技术指南?

📊 实战项目分享

📚 技术原理讲解

🧠 数据库架构思维

🛠 工具推荐与实用技巧

立即关注,持续更新中 👇

相关推荐
辰_砂1 分钟前
Rockylinux9系统安装KingBaseESV9
数据库
馨羽的玩具3 分钟前
查哪个程序一直登录sql server失败
运维·服务器·数据库
midsummer_woo3 分钟前
基于springboot的编程训练系统设计与实现(源码+论文)
数据库·spring boot·oracle
看天走路吃雪糕25 分钟前
墨者:SQL手工注入漏洞测试(Oracle数据库)
数据库·oracle·sql注入·墨者靶场
GreatSQL社区35 分钟前
CTE查询数据量过大导致MySQL 8.0发生CORE问题解析
android·数据库·mysql
格发许可优化管理系统2 小时前
GTSuite许可证性能优化建议
大数据·运维·数据库·安全·性能优化·数据分析
lang201509282 小时前
Apache Ignite 中的分布式 JOIN 操作
数据库·分布式·ignite
字节高级特工2 小时前
【Linux篇】补充:消息队列和systemV信号量
linux·运维·服务器·c语言·数据库
程序员JerrySUN3 小时前
关注 Yocto项目实战教程
运维·数据库·嵌入式硬件·缓存
兮山与3 小时前
数据库4.0
数据库