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 小时前
MVCC初学demo(一
数据库·后端·mysql
.Shu.2 小时前
Redis Reactor 模型详解【基本架构、事件循环机制、结合源码详细追踪读写请求从客户端连接到命令执行的完整流程】
数据库·redis·架构
薛晓刚5 小时前
当MySQL的int不够用了
数据库
SelectDB技术团队5 小时前
Apache Doris 在菜鸟的大规模湖仓业务场景落地实践
数据库·数据仓库·数据分析·apache doris·菜鸟技术
星空下的曙光6 小时前
mysql 命令语法操作篇 数据库约束有哪些 怎么使用
数据库·mysql
小楓12016 小时前
MySQL數據庫開發教學(一) 基本架構
数据库·后端·mysql
染落林间色6 小时前
达梦数据库-实时主备集群部署详解(附图文)手工搭建一主一备数据守护集群DW
数据库·sql
颜颜yan_6 小时前
企业级时序数据库选型指南:从传统架构向智能时序数据管理的转型之路
数据库·架构·时序数据库
lichenyang4536 小时前
管理项目服务器连接数据库
数据库·后端
沙振宇6 小时前
【数据库】通过‌phpMyAdmin‌管理Mysql数据
数据库·mysql