awrsqrpt.sql报告不适合直接diff对比,因其输出受终端宽度影响且含大量格式内容;应使用awrddrpt.sql在库内计算delta,或直查dba_hist_*视图提取结构化差异。
不能直接用 awrsqrpt.sql 的输出做 diff —— 两个文本文件一比,90% 是格式差异,不是性能差异。
为什么 awrsqrpt.sql 报告不适合对比
很多人把两次 awrsqrpt.sql 生成的文本报告丢进 diff 或 Excel 里逐行比对,结果发现“逻辑读多了 12 行”“SQL ID 排序变了”,其实全是假信号。原因很实在:
-
awrsqrpt.sql输出依赖 SQL*Plus 终端宽度,同一参数下,set linesize 120和set linesize 200会生成不同折行,diff 立刻报错 - 它不输出纯数值行:比如 “SQL ordered by Elapsed Time” 下面才是表格,而表头、分隔线、空行都算“内容”,机器无法稳定提取 delta
- Oracle 官方从不承诺该脚本输出具备可比性 —— 它只面向人工阅读,不是为程序解析设计的
真正能做差异分析的是 awrddrpt.sql
awrddrpt.sql 不是拼两个 awrsqrpt,而是在数据库内直接拉取两个快照区间的原始统计值(比如 DBA_HIST_SYS_TIME_MODEL、DBA_HIST_SQLSTAT),归一化计算后输出带明确 Delta 和 % Change 的结构化文本。关键点:
- 必须用 SQL*Plus 连接目标库执行:
@?/rdbms/admin/awrddrpt.sql - 交互时要输两组快照范围:先输 baseline(比如昨天 14:00–15:00 的
begin_snap_id/end_snap_id),再输 comparison(比如今天同一时段) - 输出中每个指标都带变化量,例如:
DB Time 12,456s +3,102s (+33.1%),可直接grep "CPU time"或导出为 CSV - 注意限制:两个区间必须属于同一
dbid,RAC 环境需提前指定inst_num,否则报ORA-13783
想自动化提取差异?绕过脚本,直查 DBA_HIST_* 视图
如果需要每天定时跑出“TOP 5 SQL 逻辑读增长榜”,别依赖 awrddrpt.sql 的文本输出——它没法返回结果集。正确路径是写 SQL 查历史视图:
-
DBA_HIST_SNAPSHOT确认快照时间有效性(status = 0表示完整) -
DBA_HIST_SQLSTAT提供每个 SQL 在各快照区间的buffer_gets_delta、executions_delta等原始差值 - 典型查询模式:用两个
snap_id区间做子查询,JOIN后算差值并ORDER BY buffer_gets_delta DESC - 避免硬编码:用
TO_DATE('2026-04-15 14:00', 'YYYY-MM-DD HH24:MI')配合MIN(snap_id)动态取快照号,防止手工输错
真正难的不是生成差异,而是判断“+23% 逻辑读”是否真有问题 —— 它可能来自业务量自然上涨,也可能来自某条 SQL 执行计划突变。所以每次对比前,先确认两个快照区间是否具有可比性:业务负载类型、并发用户数、是否有批量作业介入,这些不会写在报告里,但决定你看到的数字有没有意义。











