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

发布于:2025-07-04 ⋅ 阅读:(14) ⋅ 点赞:(0)

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


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

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

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

📊 实战项目分享

📚 技术原理讲解

🧠 数据库架构思维

🛠 工具推荐与实用技巧

立即关注,持续更新中 👇


网站公告

今日签到

点亮在社区的每一天
去签到