在上一篇文章中,我们介绍了 SQL_TRACE + TKPROF 这对性能诊断黄金组合,很多读者反馈“干货满满,实战好用”。
但当你遇到更棘手的问题时——
这时,10046诊断事件 就该登场了!
它是 Oracle 官方未公开的扩展诊断工具,被无数 DBA 称为“性能排查的核武器”。今天我们从原理到实战,手把手教你用好它,读完你就能在生产环境精准定位“隐形杀手”。
点赞 + 关注 + 转发,下期继续分享进阶组合拳,一起成为 Oracle 性能优化高手!
10046 是 Oracle 的扩展诊断事件(Diagnostic Event),专门用于产生更丰富的 SQL 跟踪信息。
它本质上是 SQL_TRACE 的增强版,主要优势在于:
一句话总结区别:
注意:虽然强大,但它是未公开事件,生产环境请谨慎使用,跟踪完及时关闭,避免产生过多 trace 文件占用空间。
SQL
SELECT DISTINCT SID FROM V$MYSTAT;
SELECT VALUE FROM V$DIAG_INFO WHERE NAME = 'Default Trace File';
SQL
ALTER SESSION SET EVENTS '10046 trace name context forever, level 12';
(forever 表示在整个会话期间持续有效)
SQL
ALTER SESSION SET EVENTS '10046 trace name context off';
SQL
-- 先查目标会话
SELECT SID, SERIAL#, USERNAME, PROGRAM
FROM V$SESSION
WHERE USERNAME IS NOT NULL;
-- 开启
EXEC DBMS_SYSTEM.SET_EV(1, 7, 10046, 12, ''); -- SID, SERIAL#, 10046, Level 12
-- 执行测试SQL...
-- 关闭
EXEC DBMS_SYSTEM.SET_EV(1, 7, 10046, 0, '');
跟踪第三方会话(需要知道 SPID):
SQL
-- 查 SPID
SELECT SPID FROM V$PROCESS WHERE ADDR = (SELECT PADDR FROM V$SESSION WHERE SID = 32);
-- 设置
ORADEBUG SETOSPID 2045
ORADEBUG EVENT 10046 TRACE NAME CONTEXT FOREVER, LEVEL 12
-- 执行SQL...
-- 关闭
ORADEBUG EVENT 10046 TRACE NAME CONTEXT OFF
-- 查看 trace 文件
ORADEBUG TRACEFILE_NAME
跟踪当前会话(超级方便):
SQL
ORADEBUG SETMYPID
ORADEBUG EVENT 10046 TRACE NAME CONTEXT FOREVER, LEVEL 12
-- 执行SQL...
ORADEBUG EVENT 10046 TRACE NAME CONTEXT OFF
ORADEBUG TRACEFILE_NAME
小贴士:oradebug 功能强大,但属于底层调试工具,使用时建议以 SYS 用户操作。
Trace 文件生成后,用 TKPROF 格式化(推荐参数):
Bash
tkprof your_tracefile.trc report.txt sys=no sort=exeela
报告核心字段解读(重点复习):
优化口诀:先看 elapsed 和 disk,高了就重点优化;再看 waits,找出具体在等什么(db file sequential read、latch 等)。
生产注意事项:
掌握了 10046 Level 12 + TKPROF,你就已经拥有了比普通 DBA 强一个档次的诊断能力。下次再遇到“SQL慢但不知道为什么慢”,直接 Trace 起来,5-10 分钟出报告,领导和同事都会对你刮目相看!
评论区互动: 你目前最常遇到的性能问题是什么?是等待事件多?还是绑定变量导致的计划问题?或者执行计划不稳定? 我在后台一一回复,欢迎交流~
—— 睿 | Oracle性能优化老司机 专注硬核干货,欢迎关注,一起卷技术,少背锅!
