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

什么是 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 执行细节

相关推荐
AllData公司负责人2 小时前
AI大模型数据开发底座系列说明书,AllData集成Chat2DB开源项目建设AI 数据库分析底座,涵盖AI 洞察/对话SQL/智能视图!
数据库·人工智能·sql·开源·ai 洞察·对话sql
xixingzhe23 小时前
数据库备份的分类与特点
数据库
时间的拾荒人6 小时前
Redis 主从复制详解:配置实操 + 原理机制
数据库·redis·面试
隔窗听雨眠7 小时前
MySQL三表JOIN执行内核与优化器决策机制
数据库·mysql·sql优化
Decay__8 小时前
SQLServer 索引与 SQL 优化 —— 聚集索引、非聚集索引、覆盖索引、碎片维护与执行计划
运维·数据库·sql·mysql·架构
笃行3509 小时前
【金仓数据库产品体验官】订单增量同步实战:MERGE、OUTPUT 与 IDENTITY 的兼容验证
数据库
星恒随风12 小时前
MySQL 从零入门(六):复合查询详解——多表查询、自连接、子查询与 UNION
linux·服务器·数据库·mysql
无奈笑天下13 小时前
银河麒麟上lsblk命令教程详解
linux·运维·服务器·数据库
xiaoye-duck15 小时前
《C++ 项目:手写大模型接入 SDK》会话模块整合:内存 SessionManager 与 DataManager 持久化联动
开发语言·数据库·c++·语言模型
AllData公司负责人15 小时前
AI大模型数据开发底座系列说明书:AllData集成DB-GPT开源项目建设 AI 多模态分析底座,涵盖模态解析/智能大屏/MCP 扩展!
大数据·数据库·人工智能·gpt·数据采集·数据接入·模态解析