-- 方式一:使用DBMS_ADDM获取文本报告 SELECT DBMS_ADDM.GET_REPORT('任务名称') FROM dual;
-- 方式二:通过视图查询Findings SELECT task_name, finding_name, impact, message FROM dba_advisor_findings WHERE task_name LIKE'ADDM%' ORDERBY task_id DESC, impact DESC;
ADDM 报告解读示例
一份典型的 ADDM Finding 输出如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
FINDING 1: 67% impact on DB Time SQL statement "SELECT * FROM orders WHERE customer_id = :1 AND status = :2" was consuming significant database time. RECOMMENDATION 1: SQL Tuning Action: Run SQL Tuning Advisor for SQL_ID abc123def Rationale: Estimated 45% improvement with new execution plan RECOMMENDATION 2: Schema Modification Action: CREATE INDEX idx_orders_cust_status ON orders(customer_id, status) Rationale: The current plan uses full table scan on ORDERS (3.2M rows)
FINDING 2: 15% impact on DB Time Log file sync waits were consuming significant database time. RECOMMENDATION 1: Configuration Action: Increase redo log file size from 200M to 1G Rationale: Average log file parallel write latency is 12ms
-- 实时查看当前活动会话的等待情况 SELECT s.sid, s.serial#, s.sql_id, s.event, s.wait_class, s.seconds_in_wait, s.blocking_session, q.sql_text FROM v$session s LEFTJOIN v$sql q ON s.sql_id = q.sql_id WHERE s.status ='ACTIVE' AND s.wait_class !='Idle' ORDERBY s.seconds_in_wait DESC;
周期性性能问题的 AWR 趋势分析
对于每天固定时段出现的性能问题:
1 2 3 4 5 6 7 8 9 10 11 12
-- 对比最近7天同一时段的DB Time趋势 SELECT TO_CHAR(sn.begin_interval_time, 'DY HH24:MI') AS snap_time, ROUND(SUM(st.db_time_delta)/1e6, 2) AS db_time_sec, ROUND(SUM(st.cpu_time_delta)/1e6, 2) AS cpu_time_sec FROM dba_hist_sys_time_model st JOIN dba_hist_snapshot sn ON st.snap_id = sn.snap_id AND st.instance_number = sn.instance_number WHERE sn.begin_interval_time > SYSDATE -7 AND st.stat_name ='DB time' GROUPBY sn.snap_id, sn.begin_interval_time ORDERBY sn.begin_interval_time;
四、结果验证
AWR 报告关键指标检查清单
检查项
重点关注
警告阈值
DB Time vs Elapsed Time
DB Time 是否超过 Elapsed Time
> 1x(多会话并发)
DB CPU %
CPU 在 DB Time 中的占比
< 50%(说明等待严重)
Buffer Cache Hit Ratio
缓存命中率
< 90%
Library Cache Hit Ratio
库缓存命中率
< 95%
Hard Parse %
硬解析占比
> 5%
Redo Log Switch/hour
日志切换频率
> 6次/小时
Top Wait Event 占比
第一等待事件占比
> 30%(需关注)
Top SQL 占比
第一SQL的DB Time占比
> 50%(集中度高)
ASH Top Events 验证
修复操作后,通过 ASH 验证等待事件是否消除:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
-- 对比修复前后某等待事件的ASH采样数 -- 假设修复前时间段:10:00-11:00,修复后:11:00-12:00 SELECT'修复前'ASperiod, event, COUNT(*) AS samples FROM dba_hist_active_sess_history WHERE sample_time BETWEEN TO_DATE('2026-06-07 10:00', 'YYYY-MM-DD HH24:MI') AND TO_DATE('2026-06-07 11:00', 'YYYY-MM-DD HH24:MI') AND event ='enq: TX - row lock contention' GROUPBY event UNIONALL SELECT'修复后'ASperiod, event, COUNT(*) AS samples FROM dba_hist_active_sess_history WHERE sample_time BETWEEN TO_DATE('2026-06-07 11:00', 'YYYY-MM-DD HH24:MI') AND TO_DATE('2026-06-07 12:00', 'YYYY-MM-DD HH24:MI') AND event ='enq: TX - row lock contention' GROUPBY event;
ADDM 建议执行后的效果验证
1 2 3 4 5 6 7 8 9
-- 创建修复后的ADDM任务,对比Finding数量和Impact -- 如果原Finding的Impact大幅下降或消失,说明修复有效 SELECT task_name, finding_name, ROUND(impact, 2) AS impact_pct, message FROM dba_advisor_findings WHERE task_name IN ('ADDM_BEFORE', 'ADDM_AFTER') ORDERBY task_name, impact DESC;
五、经验总结
AWR 报告的 5 分钟速读法
在紧急情况下,按照以下顺序快速阅读 AWR 报告:
看时间范围(30秒) — 确认快照时间和持续时间
看 Load Profile(60秒) — DB Time vs Elapsed,判断整体负载
看 Top 5 Timed Events(120秒) — 确定主要瓶颈类型
看 Top SQL by Elapsed(90秒) — 找到最耗时的 SQL
看 IO Statistics(60秒) — 确认是否有 I/O 瓶颈
整个过程不超过 5 分钟,即可形成初步诊断方向。
常见等待事件速查表
Wait Event
Wait Class
常见原因
处理方向
db file sequential read
User I/O
索引范围扫描、单块读
检查索引效率、I/O 子系统
db file scattered read
User I/O
全表扫描、多块读
添加索引、优化 SQL
enq: TX - row lock contention
Application
行锁竞争
检查事务提交频率、应用逻辑
enq: TM - contention
Application
表级锁(DML 与 DDL 冲突)
检查外键索引、DDL 时机
log file sync
Commit
事务提交等待日志写入
增大 redo log、优化 I/O
latch: shared pool
Concurrency
硬解析过多、Shared Pool 碎片化
使用绑定变量、调整 Shared Pool
library cache pin/lock
Concurrency
SQL 解析竞争
减少硬解析、避免高并发 DDL
cursor: pin S wait on X
Concurrency
绑定变量窥探导致的游标失效
关闭窥探或使用 SPM
gc buffer busy acquire
Cluster
RAC 节点间缓存争用
优化数据分布、减少跨节点访问
direct path read
User I/O
并行查询、大表直接路径读
调整并行度、优化 PGA
ASH 在紧急故障中的应用
在生产故障中,ASH 的实时性使其成为最有力的武器:
场景一:系统突然变慢
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
-- 1. 快速看当前什么等待事件最多 SELECT event, COUNT(*) cnt FROM v$active_session_history WHERE sample_time > SYSDATE -5/1440-- 最近5分钟 AND session_type ='FOREGROUND' GROUPBY event ORDERBY cnt DESC FETCHFIRST5ROWSONLY;
-- 2. 看这个等待事件关联的SQL SELECT sql_id, COUNT(*) cnt FROM v$active_session_history WHERE sample_time > SYSDATE -5/1440 AND event ='&event_name'-- 替换为上面发现的事件 GROUPBY sql_id ORDERBY cnt DESC FETCHFIRST5ROWSONLY;