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

相关推荐
倔强的石头_1 天前
kingbase备份与恢复实战(二)—— sys_dump库级逻辑备份与恢复(Windows详细步骤)
数据库
jiayou642 天前
KingbaseES 实战:深度解析数据库对象访问权限管理
数据库
李广坤3 天前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
爱可生开源社区4 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba
随逸1774 天前
《从零搭建NestJS项目》
数据库·typescript
加号35 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
シ風箏5 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker
李慕婉学姐5 天前
Springboot智慧社区系统设计与开发6n99s526(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
百锦再5 天前
Django实现接口token检测的实现方案
数据库·python·django·sqlite·flask·fastapi·pip
tryCbest5 天前
数据库SQL学习
数据库·sql