awrsqrpt.sql生成的HTML报告不能直接diff,因其为人工阅读设计、格式不稳定且受终端设置影响;应使用awrddrpt.sql进行官方支持的结构化时段对比,并确保快照时间对齐、统计口径一致。
直接对比两个 awrsqrpt.sql 生成的 html 报告,几乎得不到可靠结论——因为它们不是结构化数据,而是为人工阅读设计的格式化文本,diff 工具会把换行、空格、页眉页脚全当“差异”报出来。
为什么 awrsqrpt.sql 报告不能直接 diff
很多人拿两个 awrsqrpt.sql 输出的 HTML 文件丢进 diff 或 Excel 表格里逐项比对,结果发现“逻辑读增长了 5%”,点开一看却是同一行被 SQL*Plus 自动折成了两行。这不是性能变化,是输出不稳定。
-
awrsqrpt.sql的输出依赖终端宽度、SQL*Plus 版本、甚至当前会话的LINESIZE设置 - 关键指标(如
buffer_gets_delta)不以纯数值行形式存在,而是嵌在段落标题后、表格中、甚至跨页 - Oracle 官方从不承诺该脚本输出具备可比性;它只用于单次人工诊断
真正能做 AWR 时间段对比的是 awrddrpt.sql
awrddrpt.sql(AWR Difference Report)才是 Oracle 官方唯一支持跨时段定量对比的工具。它不是拼两个报告,而是在数据库内拉取原始统计值,做归一化计算后输出带 delta 和 % 的稳定结构化内容。
- 必须用 SQL*Plus 连接目标库执行:
@?/rdbms/admin/awrddrpt.sql - 交互时先输“基线”快照范围(比如优化前的
1234–1235),再输“比较”快照范围(优化后的1240–1241) - 输出中每类指标都明确标注变化量:例如
DB Time: +12.7% (Δ=4,289 sec)、Hard Parses: +187 (Δ=+32%) - 两个区间必须属于同一
dbid,RAC 环境下还需指定inst_num
快照时间必须精确对齐到分钟级
哪怕只差 3 分钟,DB Time 和 Logical Reads 就可能因业务节奏波动失真。尤其要避开批处理中间态——比如一个报表作业刚跑一半时截的快照,和它完全结束后截的快照,负载特征完全不同。
- 查
DBA_HIST_SNAPSHOT确认两个区间的BEGIN_INTERVAL_TIME和END_INTERVAL_TIME完全一致 - 优先选业务周期稳定的时段,例如“每日 02:00–03:00 批处理刚结束”
- 手动打快照更可控:
BEGIN DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT(); END; /,记下返回的SNAP_ID
自动化提取趋势要用 DBA_HIST_* 视图,别碰脚本
如果要做周度 SQL 逻辑读增长率监控、硬解析突增告警这类事,awrddrpt.sql 也不合适——它是交互式工具,不返回结果集。正确路径是直查历史视图:
-
DBA_HIST_SQLSTAT存每个 SQL 在各快照区间的增量统计(buffer_gets_delta、executions_delta等) -
DBA_HIST_SNAPSHOT用来过滤有效快照(status = 0表示完整) - 典型写法:用两个
snap_id区间做子查询,算差值并按buffer_gets_delta排序,避免依赖任何脚本输出格式
最常被忽略的一点:AWR 对比的前提是两次采集的统计口径一致。如果优化前后 STATISTICS_LEVEL 从 TYPICAL 改成了 BASIC,或者快照保留策略被调整过,所有 delta 值都会失效——得先确认 DBA_HIST_WR_CONTROL 里的配置没变。


















