暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle SQL_TRACE 性能跟踪

187

SQL_TRACE 是 Oracle 数据库的核心诊断工具,通过捕获 SQL 执行细节帮助定位性能瓶颈。本文覆盖启用方法、文件管理、TKPROF 格式化及结果解读,助你快速掌握数据库性能诊断技能。


一、概述

SQL_TRACE 是 Oracle 提供的底层性能跟踪工具,用于捕获会话或数据库级别的 SQL 执行活动,生成跟踪文件(trace file),帮助分析:

  • SQL 执行细节
  • 性能瓶颈定位
  • 递归调用追踪

核心特点

特点 说明
细粒度跟踪 可跟踪指定会话、当前会话或整个数据库
输出文件 生成 .trc(跟踪数据)和 .trm(元数据)文件
辅助工具 配合 TKPROF 格式化输出,提升可读性

⚠️ 注意事项

  • 启用跟踪会增加系统开销,使用后应立即关闭
  • 生产环境避免全局启用,优先使用会话级跟踪

二、启用与停止方法

2.1 全局启用(⚠️ 不推荐生产环境)

-- 参数文件方式(需重启数据库)
sql_trace = true

-- 动态修改(立即生效)
ALTER SYSTEM SET sql_trace = true;
ALTER SYSTEM SET sql_trace = false;  -- 关闭

2.2 当前会话启用(最常用方式)

-- 1. 设置跟踪文件标识(便于查找)
ALTER SESSION SET tracefile_identifier = 'my_trace_20240301';

-- 2. 开始跟踪
ALTER SESSION SET sql_trace = true;

-- 3. 执行需要跟踪的 SQL
EXEC PORTFOLIO.ETL_TASK_PRO(20240301, 1);

-- 4. 结束跟踪
ALTER SESSION SET sql_trace = false;

2.3 跟踪其他会话

-- 1. 查询目标会话的 SID 和 SERIAL# SELECT sid, serial#, username FROM v$session WHERE username = 'APP_USER'; -- 2. 开始跟踪 EXEC DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(sid, serial#, true); -- 3. 停止跟踪 EXEC DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(sid, serial#, false);

三、跟踪文件管理

3.1 文件位置

-- 查看跟踪文件存放目录 SHOW PARAMETER user_dump_dest; -- 示例输出 -- user_dump_dest = /oracle/app/oracle/diag/rdbms/climb/climb/trace

3.2 文件类型说明

扩展名 说明
.trc 跟踪数据文件,记录 SQL 执行详情
.trm 跟踪元数据文件,描述 .trc 文件结构(11g 新增)

3.3 快速定位当前会话的跟踪文件

SELECT s.sid, s.server, i.instance_name || '_' || NVL(pp.server_name, NVL(ss.name, 'ora')) || '_' || p.spid || '.trc' AS trace_file_name FROM v$instance i, v$session s, v$process p, v$px_process pp, v$shared_server ss WHERE s.paddr = p.addr AND s.sid = pp.sid(+) AND s.paddr = ss.paddr(+) AND s.sid = &session_id; -- 输入会话ID

四、TKPROF 格式化工具

TKPROF 将原始 .trc 文件转换为易读的格式化报告。

4.1 基本用法

tkprof input.trc output.txt

4.2 常用参数

参数 说明 示例
explain 生成执行计划 explain=user/password
sys 是否显示 SYS 用户的递归 SQL sys=no(推荐)
aggregate 是否合并相同 SQL aggregate=yes(默认)
waits 是否显示等待事件 waits=yes
sort 排序方式 sort=fchela(按提取时间排序)

4.3 实用示例

# 基础格式化 tkprof trace_ora_12345.trc report.txt # 包含执行计划,排除系统 SQL tkprof trace_ora_12345.trc report.txt explain=scott/tiger sys=no # 按提取时间排序,显示等待事件 tkprof trace_ora_12345.trc report.txt sort=fchela waits=yes

五、TRACE 文件解读

5.1 输出指标说明

指标 含义
call SQL 执行阶段:Parse(解析)→ Execute(执行)→ Fetch(提取)
count 执行次数
cpu CPU 耗时(秒)
elapsed 总耗时(秒,含等待)
disk 物理读次数
query 一致性读块数
current 当前模式读块数(通常用于 DML)
rows 处理行数
Misses in library cache 硬解析次数
Optimizer mode 优化器模式
Parsing user id 解析用户 ID

5.2 关键关注点

高 disk 值 → 存在大量物理读,可能缺少索引或全表扫描

高 elapsed / cpu 比值 → 存在大量等待事件,需进一步分析

高 Misses in library cache → 存在硬解析,考虑使用绑定变量

Rows 与 count 比例 → 单次返回行数,判断提取效率

5.3 执行计划解读

Rows     Row Source Operation
-------  ---------------------------------------------------
  10000  TABLE ACCESS FULL (cr=1500 pr=1500 pw=0 time=500)
缩写 含义
cr 一致性读块数
pr 物理读块数
pw 物理写块数
time 操作耗时(微秒)

六、最佳实践

6.1 跟踪策略选择

场景 建议方式
单条 SQL 性能问题 会话级跟踪 + tracefile_identifier
特定应用问题 跟踪应用会话(DBMS_SYSTEM)
系统整体性能 全局启用(短暂)+ 关注后台进程

6.2 性能影响控制

  • 跟踪期间 避免大规模并发测试
  • 跟踪完成后 立即关闭(sql_trace=false)
  • 使用 sys=no 过滤系统递归调用,减少输出量

6.3 文件管理

  • 定期清理 user_dump_dest 目录(可配置 ADR 自动清理)
  • 使用 tracefile_identifier 命名规范,便于识别

6.4 标准诊断流程

┌─────────────────────────────────────────────────────────┐
│  1. 启用会话跟踪(ALTER SESSION SET sql_trace=true)    │
│                          ↓                               │
│  2. 复现问题操作                                         │
│                          ↓                               │
│  3. 关闭跟踪(ALTER SESSION SET sql_trace=false)       │
│                          ↓                               │
│  4. 使用 TKPROF 格式化                                   │
│                          ↓                               │
│  5. 分析耗时、物理读、执行计划                           │
│                          ↓                               │
│  6. 优化 SQL(加索引、改写、绑定变量)                   │
└─────────────────────────────────────────────────────────┘

七、常见问题排查

问题 可能原因 解决方案
trace 文件过大 跟踪时间过长 缩短跟踪窗口,使用 sys=no
未生成 trace 文件 user_dump_dest 权限/空间不足 检查目录权限和磁盘空间
TKPROF 报错 trace 文件损坏 重新生成 trace,检查版本兼容性
执行计划不显示 未使用 explain 参数 添加 explain=user/pwd

八、总结

SQL_TRACE + TKPROF 是 Oracle 性能诊断的经典组合:

  • SQL_TRACE:捕获原始执行数据
  • TKPROF:格式化成可读报告
  • v$session:定位会话和跟踪文件
  • 执行计划:定位性能瓶颈根因

一句话口诀开启 → 复现 → 关闭 → 格式化 → 分析 → 优化


掌握 SQL_TRACE,让你告别盲目调优,用数据驱动性能优化决策。

最后修改时间:2026-04-24 15:14:14
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论