什么是 tkprof?
tkprof(Trace Kernel PROFiler )是 Oracle 提供的一个工具,用于格式化 10046 Trace 文件 。
它能将 Oracle 内部记录的二进制 trace 信息转换成人类可读的格式,并汇总 SQL 执行统计、等待事件等数据。
简单说:
10046 trace 提供原始数据,tkprof 帮你"读懂"它。
tkprof 的使用场景
你可以通过 tkprof 分析以下问题:
-
哪条 SQL 执行次数最多?
-
哪条 SQL 最耗 CPU 或 I/O?
-
SQL 是否使用绑定变量?
-
某条语句在 Parse、Execute、Fetch 三个阶段各耗时多少?
-
是否有频繁的物理读(disk)、一致性读(consistent get)?
基本使用方法
bash
tkprof 输入.trc 输出.log [选项...]
例如:
bash
tkprof orcl_ora_12345_10046.trc tkprof_output.log explain=scott/tiger sys=no waits=yes sort=prsela,exeela,fchela
常用参数说明
| 参数 | 说明 |
|---|---|
explain=user/pwd |
生成执行计划(依赖对象当前状态) |
sys=no |
排除 SYS 用户 SQL(避免干扰) |
waits=yes |
显示等待事件信息 |
sort=prsela,... |
按照某项耗时排序输出 SQL |
Trace 文件从哪来?
Trace 文件是通过启用 10046 trace 生成的,你可以通过以下 SQL 找到当前会话的 trace 文件路径:
sql
SELECT c.value || '/' || d.instance_name || '_ora_' || a.spid || '.trc' AS trace_file
FROM v$process a, v$session b, v$parameter c, v$instance d
WHERE a.addr = b.paddr
AND b.audsid = USERENV('sessionid')
AND c.name = 'user_dump_dest';
tkprof 输出结构解析
以典型输出结构为例:
sql
select * from emp where deptno = :b1;
call count cpu elapsed disk query current rows
------- ------ ---- -------- ----- ------ -------- -----
Parse 1 0.00 0.00 0 0 0 0
Execute 5 0.01 0.01 0 0 0 0
Fetch 5 0.02 0.02 3 20 0 10
------- ------ ---- -------- ----- ------ -------- -----
total 11 0.03 0.03 3 20 0 10
各列说明
| 项目 | 含义 |
|---|---|
Parse |
解析阶段(硬解析或软解析) |
Execute |
执行阶段(可能多次执行) |
Fetch |
取数阶段(从缓冲或磁盘中获取行) |
cpu |
CPU 消耗时间(秒) |
elapsed |
总耗时(秒) |
disk |
物理读次数(从磁盘) |
query |
一致性读次数(consistent gets) |
current |
当前块读(current gets,DML 时常见) |
rows |
返回行数 |
示例分析:定位慢 SQL
sql
select name from customers where id = :b1;
call count cpu elapsed disk query current rows
------- ----- ---- -------- ---- ------ -------- ----
Parse 1 0.00 0.00 0 0 0 0
Execute 100 0.10 0.11 0 0 0 0
Fetch 100 2.70 5.10 150 20000 0 100
total 201 2.80 5.21 150 20000 0 100
-
每次 Fetch 1 行,但总计发生 20000 次一致性读 + 150 次磁盘读
-
可初步判断:可能走了全表扫描或索引不合理
结合 tkprof 输出的执行计划(EXPLAIN PLAN)和绑定变量,还可进一步确认路径选择是否合理。
按执行耗时排序 SQL
通过 sort= 参数可以控制输出顺序,例如:
bash
tkprof trace.trc output.log sort=exeela
| sort 关键词 | 含义 |
|---|---|
prsela |
parse elapsed time |
exeela |
execute elapsed time |
fchela |
fetch elapsed time |
cpu |
总 CPU 时间 |
disk |
物理读数量 |
这样可快速识别"最耗时的 SQL"。
注意事项
-
tkprof 的
explain=生成的执行计划取决于当前环境下的对象状态,可能与实际执行时不同 -
只有当启用了
10046 trace(level 1/4/8/12)时,trace 文件中才会包含详细的执行信息 -
tkprof并不会改变数据库内容,它只是格式化工具
小结
| 优点 | 限制 |
|---|---|
| 可读性好,适合初学者上手分析 trace | 只适用于已经生成的 trace 文件 |
| 能输出 SQL 的每个阶段耗时 | 生成的 EXPLAIN PLAN 非实时 |
| 支持排序、筛选等输出优化 | 不包含 AWR/ASH 层面的系统视角 |
推荐组合使用:
-
10046 trace + tkprof → 查看 SQL 执行耗时、等待事件
-
tkprof + SQL Plan Baseline → 分析执行变化原因
-
tkprof + AWR Top SQL → 深度分析 Top SQL 执行细节