Oracle 性能分析系列:tkprof 工具详解 —— 解码 10046 Trace 的利器

什么是 tkprof?

tkprofTrace 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 执行细节

相关推荐
2501_945423546 小时前
数据分析师的Python工具箱
jvm·数据库·python
xingyynt6 小时前
【HTML+CSS】使用HTML与后端技术连接数据库
css·数据库·html
2401_879693876 小时前
自动化与脚本
jvm·数据库·python
敬业小码哥6 小时前
记一次:sqlit3恢复database disk image is malformed
数据库·sql·sqlite3
tumeng07116 小时前
Redis如何设置密码
数据库·redis·缓存
奕成则成6 小时前
Redis 大 Key 治理实战:从告警止血到长期优化(含命令与阈值)
数据库·redis·缓存
Xzq2105096 小时前
Mysql API学习
数据库·学习·mysql
三更两点6 小时前
AI Agent 的全栈上下文工程:蒸馏、整合、护栏与评估
数据库·人工智能
skiy6 小时前
redis连接服务
数据库·redis·bootstrap
野犬寒鸦6 小时前
从零起步学习AI大模型应用开发 || 第三章:智能体项目实战中的问题与解决方案及思路详解
java·服务器·数据库·人工智能·后端·面试