Oracle SQL Trace 与 TKPROF
Oracle SQL Trace 与 TKPROF
适用版本:Oracle Database 10g / 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07
1. 概述
SQL Trace 是详细 SQL 执行追踪[1]:
配套工具:
- 10046 事件
- TKPROF(格式化)
- trcsess(合并)
详细见:Oracle 10046 事件与 SQL Trace。
2. 启用 Trace
2.1 自身会话
ALTER SESSION SET sql_trace = TRUE;
-- 或 10046
ALTER SESSION SET EVENTS '10046 trace name context forever, level 12';
-- level 1: 标准
-- level 4: 加绑定变量
-- level 8: 加等待事件
-- level 12: 加 4+8
-- 执行 SQL
ALTER SESSION SET sql_trace = FALSE;
ALTER SESSION SET EVENTS '10046 trace name context off';
2.2 其他会话
-- 11g+
BEGIN
DBMS_MONITOR.SESSION_TRACE_ENABLE(
session_id => 123,
serial_num => 456,
waits => TRUE,
binds => TRUE
);
END;
/
-- 关闭
EXEC DBMS_MONITOR.SESSION_TRACE_DISABLE(session_id => 123, serial_num => 456);
2.3 客户端 ID
EXEC DBMS_SESSION.SET_IDENTIFIER('my_app');
EXEC DBMS_MONITOR.CLIENT_ID_TRACE_ENABLE('my_app');
-- 应用设置后自动 trace
3. Trace 文件
3.1 位置
SELECT value FROM v$diag_info WHERE name = 'Default Trace File';
3.2 命名
<SID>_ora_<SPID>.trc
4. TKPROF
4.1 使用
tkprof input.trc output.prf
explain=scott/tiger
sys=no
sort=execpu
4.2 参数
| 参数 | 说明 |
|---|---|
| explain | 执行计划 |
| sys=no | 排除 SYS SQL |
| sort | 排序(execpu/fchpu) |
| print=N | 显示 N 条 |
| aggregate=yes/no | 聚合 |
4.3 排序
execpu: 执行 CPUfchpu: 获取 CPUexeela: 执行时间fchela: 获取时间
5. TKPROF 报告解读
5.1 SQL 概要
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.00 0 0 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 2 0.01 0.01 0 10 0 1
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 4 0.01 0.01 0 10 0 1
5.2 字段
| 字段 | 说明 |
|---|---|
| count | 次数 |
| cpu | CPU 时间 |
| elapsed | 实际时间 |
| disk | 物理读 |
| query | 一致性读 |
| current | 当前模式读 |
| rows | 行数 |
5.3 关注点
- 高 query:逻辑读多
- 高 disk:物理读多
- Parse 多:硬解析多
- elapsed >> cpu:等待
6. 执行计划
6.1 显示
Rows Row Source Operation
----- ---------------------------------------------------
10 TABLE ACCESS FULL EMPLOYEES (cr=7 pr=0 pw=0 time=... )
6.2 字段
- cr: 一致性读
- pr: 物理读
- pw: 物理写
- time: 时间(微秒)
7. 等待事件
7.1 显示
WAIT #1: nam='db file sequential read' ela= 1234 file#=4 block#=1234 ...
7.2 分析
- 频繁等待:瓶颈
- 长等待:性能
8. 多会话 Trace
8.1 trcsess
trcsess output=combined.trc
clientid=my_app
*.trc
8.2 TKPROF
tkprof combined.trc combined.prf
9. 实战
9.1 调优慢 SQL
-- 1. 启用 trace
ALTER SESSION SET EVENTS '10046 trace name context forever, level 12';
-- 2. 执行
SELECT ... FROM big_table WHERE ...;
-- 3. 关闭
ALTER SESSION SET EVENTS '10046 trace name context off';
# 4. TKPROF
tkprof orcl_ora_12345.trc report.prf explain=scott/tiger sys=no sort=exeela
# 5. 分析
9.2 调优 PL/SQL
ALTER SESSION SET EVENTS '10046 trace name context forever, level 12';
EXEC my_proc;
ALTER SESSION SET EVENTS '10046 trace name context off';
10. 应用层 Trace
10.1 标识
-- 应用连接时设置
EXEC DBMS_SESSION.SET_IDENTIFIER('app_user_123');
10.2 启用
EXEC DBMS_MONITOR.CLIENT_ID_TRACE_ENABLE('app_user_123');
11. 常见坑与排错
11.1 找不到 trace 文件
-- 查找
SELECT value FROM v$diag_info WHERE name = 'Default Trace File';
-- 11g+
SELECT tracefile FROM v$process WHERE addr = (
SELECT paddr FROM v$session WHERE sid = USERENV('SID')
);
11.2 TKPROF 报告空
# 1. 检查 trace 文件
# 2. sys=no 可能过滤太多
# 3. 检查 explain 用户
11.3 trace 文件过大
-- 1. 控制时段
-- 2. 限制 SQL
-- 3. trcsess 合并
12. 最佳实践
- level 12:完整信息
- TKPROF 排序:按时间
- sys=no:过滤系统
- 短时段 trace:精准
- trcsess 合并:多会话
- 结合 AWR:长期
- 结合 ASH:实时
- 定位慢 SQL:根因
- 测试验证:效果
- 清理 trace:空间
13. 参考资料
[1] Oracle Database SQL Tuning Guide 19c, “SQL Trace” https://docs.oracle.com/en/database/oracle/oracle-database/19/tgsql/sql-trace.html