Oracle AWR 详解

Oracle AWR 详解

适用版本:Oracle Database 10g / 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07


1. 概述

AWR(Automatic Workload Repository)是 Oracle 性能数据仓库[1]:

作用

  • 性能数据收集
  • 历史数据
  • 报告生成
  • 自治优化

详细见:Oracle AWR 报告详解


2. 架构

┌────────────────────────────────┐
│  MMON(Manageability Monitor) │
│  - 自动快照                    │
└────────────┬───────────────────┘

┌────────────▼───────────────────┐
│  SYSAUX 表空间                 │
│  - WRx$ 表                     │
│  - 历史数据                    │
└────────────────────────────────┘

3. 配置

3.1 STATISTICS_LEVEL

SHOW PARAMETER statistics_level
-- TYPICAL(默认)/ ALL / BASIC

ALTER SYSTEM SET statistics_level = ALL SCOPE=SPFILE;

3.2 快照设置

-- 查询
SELECT snap_interval, retention FROM dba_hist_wr_control;

-- 修改
EXEC DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(
  retention => 43200,   -- 30 天(分钟)
  interval  => 30       -- 30 分钟
);

3.3 启用

-- CONTROL_MANAGEMENT_PACK_ACCESS
SHOW PARAMETER control_management_pack_access
-- DIAGNOSTIC+TUNING(默认)
ALTER SYSTEM SET control_management_pack_access = 'DIAGNOSTIC+TUNING';

4. 快照管理

4.1 手动快照

EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT;
-- ALL(默认) / TYPICAL

EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT(flush_level => 'ALL');

4.2 删除

EXEC DBMS_WORKLOAD_REPOSITORY.DROP_SNAPSHOT_RANGE(
  low_snap_id => 100,
  high_snap_id => 200
);

4.3 修改

EXEC DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(...);

4.4 查看

SELECT snap_id, begin_interval_time, end_interval_time, error_count
FROM dba_hist_snapshot
ORDER BY snap_id DESC;

5. Baseline

5.1 创建

EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_BASELINE(
  start_snap_id => 100,
  end_snap_id => 110,
  baseline_name => 'peak_baseline',
  expiration => 30  -- 天
);

5.2 模板

-- 创建模板
EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_BASELINE_TEMPLATE(
  start_time => TO_DATE('2026-07-21 09:00', 'YYYY-MM-DD HH24:MI'),
  end_time => TO_DATE('2026-07-21 18:00', 'YYYY-MM-DD HH24:MI'),
  baseline_name => 'workday',
  expiration => 365
);

5.3 查看

SELECT baseline_id, baseline_name, start_snap_id, end_snap_id, expiration
FROM dba_hist_baseline;

5.4 删除

EXEC DBMS_WORKLOAD_REPOSITORY.DROP_BASELINE(
  baseline_name => 'peak_baseline'
);

6. AWR 报告

6.1 命令行

# 单实例
sqlplus / as sysdba
@?/rdbms/admin/awrrpt.sql

# RAC
@?/rdbms/admin/awrgrpt.sql  -- 整集群
@?/rdbms/admin/awrrpti.sql  -- 单实例

# 周期
@?/rdbms/admin/awrrpt.sql

6.2 选项

- HTML / TEXT
- snap_id 范围
- 实例

6.3 生成

-- 脚本
SELECT output FROM TABLE(DBMS_WORKLOAD_REPOSITORY.AWR_REPORT_HTML(
  dbid => :dbid,
  inst_num => :inst,
  bid => :begin_snap,
  eid => :end_snap
));

6.4 ASH

@?/rdbms/admin/ashrpt.sql

详细见:Oracle ASH 详解

6.5 ADDM

@?/rdbms/admin/addmrpt.sql

详细见:Oracle ADDM 详解

6.6 对比

@?/rdbms/admin/awrddrpt.sql  -- AWR 对比

7. AWR 报告内容

7.1 概要

- DB 时间
- DB CPU
- 快照范围
- 数据库信息

7.2 Top 5 等待事件

- 主要瓶颈
- 等待事件
- 时间占比

详细见:Oracle 等待事件详解

7.3 SQL 统计

- Top SQL(elapsed time)
- Top SQL(CPU)
- Top SQL(gets)
- Top SQL(reads)
- Top SQL(executions)
- Top SQL(parse)

7.4 实例活动

- Load Profile
- Instance Efficiency
- Top 5 Timed Events

7.5 I/O

- Tablespace I/O
- File I/O
- Buffer Pool

7.6 内存

- SGA
- PGA
- Buffer Cache
- Shared Pool

详细见:Oracle 内存管理 SGA/PGA

7.7 并发

- 锁
- Latch
- Mutex

详细见:Oracle 锁与闩锁诊断


8. AWR 视图

8.1 主要

视图内容
DBA_HIST_SNAPSHOT快照
DBA_HIST_SQLSTATSQL 统计
DBA_HIST_SYSSTAT系统统计
DBA_HIST_SYSMETRIC系统指标
DBA_HIST_ACTIVE_SESS_HISTORYASH
DBA_HIST_WAITSTAT等待
DBA_HIST_LATCHLatch
DBA_HIST_SEG_STAT段统计
DBA_HIST_TABLESPACE_STAT表空间
DBA_HIST_FILESTAT文件
DBA_HIST_BASELINE基线
DBA_HIST_WR_CONTROL配置

8.2 查询示例

-- Top SQL
SELECT sql_id, executions, elapsed_time, cpu_time, buffer_gets, disk_reads
FROM dba_hist_sqlstat
WHERE snap_id BETWEEN 100 AND 110
ORDER BY elapsed_time DESC FETCH FIRST 10 ROWS ONLY;

-- 等待事件
SELECT event_name, total_waits, time_waited
FROM dba_hist_system_event
WHERE snap_id = 110
ORDER BY time_waited DESC FETCH FIRST 10 ROWS ONLY;

-- 段统计
SELECT obj#, dataobj#, logical_reads, db_block_changes, physical_reads
FROM dba_hist_seg_stat
WHERE snap_id = 110
ORDER BY logical_reads DESC FETCH FIRST 10 ROWS ONLY;

9. 自定义查询

9.1 Top SQL 时间段

SELECT s.sql_id, 
       SUM(s.elapsed_time_delta) / 1000000 AS elapsed_sec,
       SUM(s.cpu_time_delta) / 1000000 AS cpu_sec,
       SUM(s.buffer_gets_delta) AS gets,
       SUM(s.disk_reads_delta) AS reads
FROM dba_hist_sqlstat s
WHERE s.snap_id BETWEEN 100 AND 110
GROUP BY s.sql_id
ORDER BY elapsed_sec DESC FETCH FIRST 10 ROWS ONLY;

9.2 SQL 文本

SELECT sql_text FROM dba_hist_sqltext WHERE sql_id = '&sql_id';

9.3 SQL 计划

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_AWR('&sql_id'));

详细见:Oracle 执行计划详解


10. AWR Warehouse

10.1 概述

- AWR 数据集中
- 多库聚合
- OEM 13c

10.2 配置

Setup → AWR Warehouse
- 添加源
- 配置同步

11. 性能影响

11.1 收集开销

- TYPICAL:低
- ALL:高
- 默认足够

11.2 空间

- SYSAUX
- 30 天保留
- 监控

12. 常见坑与排错

12.1 SYSAUX 满

SELECT occupant_name, space_usage_kbytes 
FROM v$sysaux_occupants 
WHERE occupant_name LIKE '%AWR%';

-- 清理
EXEC DBMS_WORKLOAD_REPOSITORY.DROP_SNAPSHOT_RANGE(...);

12.2 快照失败

SELECT snap_id, error_count FROM dba_hist_snapshot WHERE error_count > 0;
-- MMON 问题

12.3 报告无数据

- snap_id 范围
- 实例
- 时间

13. 最佳实践

  1. STATISTICS_LEVEL = TYPICAL:默认
  2. 30 分钟快照:性能
  3. 30 天保留:历史
  4. Baseline:对比
  5. 手动快照:关键时段
  6. Top SQL 分析:优化
  7. ADDM:自治
  8. AWR Warehouse:集中
  9. 监控 SYSAUX:空间
  10. 定期报告:分析

14. 参考资料

[1] Oracle Database Performance Tuning Guide 19c, “AWR” https://docs.oracle.com/en/database/oracle/oracle-database/19/tgptg/