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 | 调用次数 |
| cpu | CPU 时间 |
| 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. 最佳实践
- Level 12 全面:绑定+等待
- 小范围跟踪:避免大文件
- TKPROF 格式化:易读
- 按 elapsed 排序:找慢 SQL
- 结合 EXPLAIN:执行计划
- 排除 SYS:聚焦业务
- 定期清理:空间
- 谨慎生产环境:性能影响
- 结合 AWR:综合分析
- 文档化:可重复
11. 参考资料
[1] Oracle Database Performance Tuning Guide 19c, “SQL Trace” https://docs.oracle.com/en/database/oracle/oracle-database/19/tgptsql/sql-trace.html