必须用awrddrpt生成compare period report,手动比对两份awrrpt报告必然出错:快照不对齐导致aas等指标归一化失真、rac下inst_num未指定掩盖跨节点争用、dbid混淆引发环境混比。

直接用 awrddrpt.sql 对比 Oracle 升级前后的性能,必须确保两个时间窗口的快照来自同一 DBID、同一实例、且快照间隔对齐——否则 AAS、I/O per sec 等核心指标全部失真,对比结果毫无参考价值。
为什么不能用升级前后各拉一份 awrrpt.sql 报告再手动比?
手动比对两份独立 awrrpt.sql 报告是典型错误操作:
- 快照间隔不一致:升级前窗口用 30 分钟快照,升级后误选 60 分钟快照,
Avg Active Sessions数值直接腰斩,误判“变好了” - DBID 混淆:测试库与生产库共用 DBID(常见于克隆环境),
awrrpt.sql默认取当前连接 DBID,可能把旧库快照和新库快照混在一起生成报告 - RAC 实例覆盖不全:升级后 RAC 节点数变化,但未指定
inst_num,awrrpt.sql只输出当前连接实例,跨节点锁争用完全不可见
awrddrpt.sql 必须显式传的四个参数
awrddrpt.sql 不是交互式“填空题”,漏掉任一关键参数就等于白跑。它底层调用 DBMS_WORKLOAD_REPOSITORY.AWR_DIFF_REPORT_TEXT,强依赖上下文一致性:
-
dbid:必须查SELECT dbid FROM v$database确认,尤其升级后若重建过控制文件或使用了备份恢复,DBID 可能已变 -
inst_num:RAC 环境下必须指定,单机也建议填1;查SELECT instance_number FROM gv$instance,别凭记忆写 -
start_snap_id和end_snap_id:必须成对存在且属于同一dbid+inst_num;升级前窗口和升级后窗口各需一对,共四组 ID -
report_type:只接受TEXT或HTML(注意大小写),输html会报错
执行前必须验证的三件事
在 SQL*Plus 中运行 @?/rdbms/admin/awrddrpt 前,先确认:
- 所有四组
snap_id在dba_hist_snapshot中真实存在:SELECT snap_id, begin_interval_time, instance_number, dbid FROM dba_hist_snapshot WHERE snap_id IN (12345,12365,12000,12020) - 四组快照的
dbid完全一致,且与当前v$database.dbid匹配——升级前后 DBID 不同,说明不是同一物理数据库,不能比 - 升级前、后窗口的快照间隔(
begin_interval_time差值)尽量接近,例如都选 30 分钟间隔;若必须用不同间隔,报告里所有“per sec”类指标要人工归一化换算
升级对比真正要看的三个硬指标
Compare Period Report 里别被总量迷惑,重点盯住单位时间强度和调度健康度:
-
Avg Active Sessions (AAS):若升级后 AAS 上升但DB CPU Per Sec未同步升高,说明瓶颈从 CPU 转向 I/O 或锁,不是数据库引擎本身问题 -
Physical Reads Per Sec:对比时注意Buffer Cache Hit Ratio是否同步下降,若 hit ratio 从 99%→92%,可能是 buffer pool 配置或访问模式变化 -
enq: TX - row lock contention次数:升级后翻倍?先确认 baseline 时段是否恰有大批量归档切换(该等待本就偏高),别直接归因为升级
最易被忽略的点:升级后若启用了新特性(如 In-Memory Column Store 或新优化器补丁),AWR 报告里的 SQL Statistics 部分可能因统计口径变化导致排序错乱,此时必须结合 DBA_HIST_SQLSTAT 手动查 elapsed_time_delta / executions_delta 做交叉验证。











