Oracle 10046 事件与 SQL Trace

Oracle 10046 事件与 SQL Trace

适用版本:Oracle Database 9i / 10g / 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07


1. 概述

10046 事件 是 Oracle 的 SQL Trace 机制[1]:

级别

级别说明
1标准 SQL Trace
4含绑定变量
8含等待事件
12含绑定+等待

2. 启用 Trace

2.1 当前会话

-- 启用
ALTER SESSION SET sql_trace = TRUE;
ALTER SESSION SET events '10046 trace name context forever, level 12';

-- 执行 SQL
SELECT * FROM employees WHERE dept_id = 10;

-- 关闭
ALTER SESSION SET sql_trace = FALSE;
ALTER SESSION SET events '10046 trace name context off';

2.2 其他会话

-- 查找 SID, SERIAL#
SELECT sid, serial# FROM v$session WHERE username = 'SCOTT';

-- 启用(DBMS_SYSTEM)
EXEC SYS.DBMS_SYSTEM.SET_EV(sid, serial#, 10046, 12, '');

-- 关闭
EXEC SYS.DBMS_SYSTEM.SET_EV(sid, serial#, 10046, 0, '');

2.3 DBMS_MONITOR

-- 会话级
EXEC DBMS_MONITOR.SESSION_TRACE_ENABLE(
  session_id => &sid,
  serial_num => &serial,
  waits => TRUE,
  binds => TRUE
);

-- 关闭
EXEC DBMS_MONITOR.SESSION_TRACE_DISABLE(session_id => &sid, serial_num => &serial);

2.4 服务/模块

EXEC DBMS_MONITOR.SERV_MOD_ACT_TRACE_ENABLE(
  service_name => 'orcl',
  module_name => 'my_module',
  waits => TRUE,
  binds => TRUE
);

3. 定位 Trace 文件

3.1 查看路径

SELECT value FROM v$parameter WHERE name = 'user_dump_dest';
-- 或 11g+
SELECT value FROM v$diag_info WHERE name = 'Default Trace File';

3.2 当前会话

SELECT 
  s.sid,
  s.serial#,
  p.tracefile
FROM v$session s, v$process p
WHERE s.paddr = p.addr
  AND s.audsid = SYS_CONTEXT('USERENV', 'SESSIONID');

4. TKPROF 格式化

4.1 基本用法

tkprof tracefile.trc output.txt

4.2 常用选项

tkprof tracefile.trc output.txt \
  explain=scott/tiger \
  sys=no \
  sort=fchela \
  aggregate=yes

4.3 选项说明

选项说明
explain执行计划
sys=no排除 SYS 语句
sort排序(fchela: elapsed time)
aggregate合并相同 SQL
print=N仅显示 N 条

5. Trace 文件内容

5.1 解析/执行/获取

PARSE: 解析 SQL
EXECUTE: 执行
FETCH: 获取数据
UNMAP: 回滚

5.2 统计

call    count  cpu   elapsed  disk  query  current  rows
Parse     1    0.01  0.01     0     0      0        0
Execute   1    0.00  0.00     0     0      0        0
Fetch     2    0.05  0.05     10    100    0        15

5.3 等待事件

WAIT #1: nam='db file sequential read' ela= 100 file#=5 block#=123 ...

5.4 绑定变量

BINDS #1:
 Bind 0: oacdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00
   oacflg=03 fl2=1000000 frm=00 csi=00 siz=24 off=0
   kxsbbbfp=... bln=22 avl=02 flg=05
   value=10

6. 解读 TKPROF

6.1 关键指标

指标说明
count调用次数
cpuCPU 时间
elapsed实际时间
disk物理读
query一致性读
current当前模式读
rows处理行数

6.2 关注点

  • high disk:物理 I/O
  • high query:逻辑 I/O
  • high elapsed:慢
  • high parse count:硬解析多

6.3 排序建议

sort=fchela   -- 按 fetch elapsed
sort=exeela   -- 按 execute elapsed
sort=prscpu   -- 按 parse cpu
sort=fchqry   -- 按 query gets

7. 应用场景

7.1 调优单条 SQL

-- 1. 启用 trace
ALTER SESSION SET events '10046 trace name context forever, level 12';

-- 2. 执行 SQL
SELECT ... ;

-- 3. 关闭
ALTER SESSION SET events '10046 trace name context off';

-- 4. tkprof 分析

7.2 跟踪应用

-- 找到应用会话
SELECT sid, serial# FROM v$session WHERE program LIKE '%app%';

-- 启用 trace
EXEC DBMS_MONITOR.SESSION_TRACE_ENABLE(sid, serial, TRUE, TRUE);

-- 应用执行

-- 关闭
EXEC DBMS_MONITOR.SESSION_TRACE_DISABLE(sid, serial);

7.3 绑定变量诊断

-- Level 4/12 显示绑定值
ALTER SESSION SET events '10046 trace name context forever, level 4';

8. 其他 Trace

8.1 10053 事件

-- 优化器决策
ALTER SESSION SET events '10053 trace name context forever, level 1';

8.2 10079 事件

-- SQL 网络跟踪
ALTER SESSION SET events '10079 trace name context forever, level 2';

8.3 Errorstack

-- ORA 错误堆栈
ALTER SYSTEM SET EVENTS '1555 trace name errorstack level 3';

9. 常见坑与排错

9.1 Trace 文件找不到

-- 1. 查看路径
SELECT value FROM v$diag_info WHERE name = 'Default Trace File';
-- 2. 查看会话
SELECT p.tracefile FROM v$session s, v$process p WHERE s.paddr = p.addr AND s.sid = &sid;

9.2 Trace 文件大

-- 1. 限制范围
-- 2. sys=no
-- 3. 定期清理

9.3 权限

-- 需要 ALTER SESSION 权限
GRANT ALTER SESSION TO user;

10. 最佳实践

  1. Level 12 全面:绑定+等待
  2. 小范围跟踪:避免大文件
  3. TKPROF 格式化:易读
  4. 按 elapsed 排序:找慢 SQL
  5. 结合 EXPLAIN:执行计划
  6. 排除 SYS:聚焦业务
  7. 定期清理:空间
  8. 谨慎生产环境:性能影响
  9. 结合 AWR:综合分析
  10. 文档化:可重复

11. 参考资料

[1] Oracle Database Performance Tuning Guide 19c, “SQL Trace” https://docs.oracle.com/en/database/oracle/oracle-database/19/tgptsql/sql-trace.html