Skip to content

Oracle AWR 报告分析

AWR 报告简介

AWR(Automatic Workload Repository)是 Oracle 数据库的自动工作负载仓库,它会定期收集数据库的性能统计信息,并生成详细的性能报告。AWR 报告是 DBA 进行性能分析和调优的重要工具。

AWR 报告的主要内容

  • 数据库基本信息:数据库版本、实例名、快照信息
  • 工作量概览:DB Time、逻辑读、物理读、执行的 SQL 语句数
  • TOP 5 等待事件:最主要的性能瓶颈
  • SQL 统计信息:消耗资源最多的 SQL 语句
  • 实例效率百分比:缓冲区命中率、库缓存命中率等
  • 内存和 I/O 统计:内存使用情况和 I/O 性能
  • 段统计信息:热点段分析
  • 初始化参数:当前参数设置

生成 AWR 报告

使用 DBMS_WORKLOAD_REPOSITORY 包

sql
-- 查看快照信息
SELECT snap_id, begin_interval_time, end_interval_time
FROM dba_hist_snapshot
ORDER BY snap_id DESC;

-- 生成 AWR 报告
EXEC DBMS_WORKLOAD_REPOSITORY.create_snapshot();

-- 手动创建快照
EXEC DBMS_WORKLOAD_REPOSITORY.create_snapshot();

使用 awrrpt.sql 脚本

sql
-- 在 SQL*Plus 中执行
@$ORACLE_HOME/rdbms/admin/awrrpt.sql

-- 按提示输入:
-- 1. 报告格式(html 或 text)
-- 2. 快照起始 ID
-- 3. 快照结束 ID
-- 4. 报告文件名

使用 awrrpti.sql 脚本(指定实例)

sql
-- 在 RAC 环境中指定实例生成报告
@$ORACLE_HOME/rdbms/admin/awrrpti.sql

-- 按提示输入:
-- 1. 报告格式
-- 2. 数据库 ID
-- 3. 实例 ID
-- 4. 快照起始 ID
-- 5. 快照结束 ID
-- 6. 报告文件名

使用 Enterprise Manager

  1. 登录 Oracle Enterprise Manager
  2. 导航到 "性能" → "性能报告"
  3. 选择 "AWR 报告"
  4. 设置时间范围和其他参数
  5. 点击 "生成报告"

AWR 报告分析方法

1. 数据库基本信息分析

关注要点

  • 数据库版本和补丁级别
  • 快照时间范围和持续时间
  • 数据库启动时间

分析技巧

  • 确认报告覆盖了性能问题发生的时间段
  • 注意数据库版本对性能特性的影响

2. 工作量概览分析

关注指标

  • DB Time:数据库时间,单位为秒
  • DB CPU:CPU 时间,单位为秒
  • Redo Size:重做日志大小
  • Logical Reads:逻辑读数量
  • Physical Reads:物理读数量
  • Executions:SQL 执行次数
  • Parse Calls:解析调用次数
  • Hard Parses:硬解析次数
  • Sorts:排序操作次数

分析技巧

  • 计算 DB Time/Elapsed Time 比值,判断数据库负载程度
  • 计算 Hard Parses/Parse Calls 比值,判断硬解析比例
  • 分析 Redo Size 变化,判断事务量大小

3. TOP 5 等待事件分析

关注要点

  • 等待事件名称
  • 等待时间(Wait Time)
  • 等待次数(Waits)
  • 平均等待时间(Avg Wait)

常见等待事件

  • db file sequential read:单个数据块的顺序读取(通常是索引扫描)
  • db file scattered read:多个数据块的分散读取(通常是全表扫描)
  • log file sync:LGWR 将重做日志缓冲区写入磁盘的等待
  • buffer busy waits:缓冲区忙等待
  • enqueue:锁等待
  • cursor: pin S:游标共享等待
  • direct path read/write:直接路径读写

分析技巧

  • 首先解决排名第一的等待事件
  • 结合其他部分的信息进行综合分析
  • 注意平均等待时间,识别严重的性能瓶颈

4. SQL 统计信息分析

关注指标

  • Elapsed Time:SQL 执行时间
  • CPU Time:CPU 消耗时间
  • Buffer Gets:逻辑读数量
  • Disk Reads:物理读数量
  • Executions:执行次数
  • Parse Calls:解析调用次数
  • Rows Processed:处理的行数

分析技巧

  • 重点关注 Elapsed Time per Execution 高的 SQL
  • 检查 Buffer Gets per Exec 异常高的 SQL
  • 结合执行计划分析 SQL 性能问题
  • 注意 SQL 的执行频率

5. 实例效率百分比分析

关注指标

  • Buffer Nowait %:缓冲区无等待百分比(应 > 99%)
  • Buffer Hit %:缓冲区命中率(应 > 95%)
  • Library Hit %:库缓存命中率(应 > 95%)
  • Execute to Parse %:执行与解析比例(应 > 90%)
  • Parse CPU to Parse Elapsd %:解析 CPU 时间与解析总时间比例(应 > 70%)
  • Redo NoWait %:重做日志无等待百分比(应 > 99%)
  • In-memory Sort %:内存排序百分比(应 > 95%)

分析技巧

  • 低于阈值的指标可能是性能瓶颈
  • 结合其他部分的信息进行综合判断
  • 注意指标的变化趋势

6. 内存统计信息分析

关注区域

  • SGA:共享池、缓冲区高速缓存、重做日志缓冲区
  • PGA:程序全局区

分析指标

  • Shared Pool:库缓存、字典缓存的使用情况
  • Buffer Cache:缓冲区命中率、脏缓冲区数量
  • PGA:PGA 使用大小、排序区使用情况

分析技巧

  • 检查共享池是否存在内存不足
  • 分析缓冲区高速缓存命中率
  • 检查 PGA 是否过大或过小

7. I/O 统计信息分析

关注指标

  • Tablespace IO Stats:表空间 I/O 统计
  • File IO Stats:数据文件 I/O 统计
  • IO Stats by Function:按功能分类的 I/O 统计

分析技巧

  • 识别 I/O 密集的表空间和数据文件
  • 检查 I/O 等待时间
  • 分析读写比例

8. 段统计信息分析

关注指标

  • Physical Reads:物理读数量
  • Logical Reads:逻辑读数量
  • Buffer Busy Waits:缓冲区忙等待次数
  • Row Lock Waits:行锁等待次数

分析技巧

  • 识别热点段(Hot Segments)
  • 分析段的访问模式
  • 考虑对热点段进行分区或索引优化

9. 初始化参数分析

关注参数

  • sga_target:SGA 目标大小
  • pga_aggregate_target:PGA 聚合目标大小
  • shared_pool_size:共享池大小
  • db_cache_size:数据库缓冲区大小
  • log_buffer:重做日志缓冲区大小
  • optimizer_mode:优化器模式
  • workarea_size_policy:工作区大小策略

分析技巧

  • 检查参数设置是否合理
  • 分析参数变化对性能的影响
  • 参考 Oracle 最佳实践调整参数

AWR 报告分析实例

分析步骤

  1. 收集 AWR 报告:生成性能问题发生时间段的 AWR 报告
  2. 分析工作量概览:了解数据库负载情况
  3. 识别 TOP 等待事件:确定主要性能瓶颈
  4. 分析高消耗 SQL:找出资源消耗最多的 SQL
  5. 检查实例效率:分析各项性能指标
  6. 综合分析:结合所有信息进行综合判断
  7. 制定优化方案:根据分析结果制定优化策略

案例分析

场景:数据库响应缓慢,用户抱怨查询时间长

AWR 报告分析

  1. 工作量概览

    • DB Time/Elapsed Time = 15.2,表明数据库负载很高
    • Hard Parses/Parse Calls = 35%,硬解析比例过高
  2. TOP 5 等待事件

      1. db file sequential read (Wait Time: 45%)
      1. cursor: pin S (Wait Time: 20%)
      1. log file sync (Wait Time: 15%)
  3. SQL 统计信息

    • 发现一个 SQL 语句消耗了 60% 的 Elapsed Time
    • 该 SQL 执行计划显示全表扫描
  4. 实例效率

    • Library Hit % = 85%,低于阈值
    • Buffer Hit % = 92%,接近阈值

优化方案

  1. 为高频查询的表添加合适的索引,减少全表扫描
  2. 使用绑定变量,减少硬解析
  3. 调整共享池大小,提高库缓存命中率
  4. 优化 LGWR 性能,减少 log file sync 等待

AWR 报告的高级使用

1. AWR 快照管理

sql
-- 查看快照设置
SELECT * FROM dba_hist_wr_control;

-- 修改快照设置(每 30 分钟收集一次,保留 7 天)
EXEC DBMS_WORKLOAD_REPOSITORY.modify_snapshot_settings(
  retention => 7*24*60,  -- 保留分钟数
  interval => 30,        -- 收集间隔分钟数
  topnsql => 100         -- 每个快照收集的 TOP SQL 数量
);

-- 删除旧快照
EXEC DBMS_WORKLOAD_REPOSITORY.drop_snapshot_range(
  low_snap_id => 1000,
  high_snap_id => 1100
);

2. AWR 基线管理

AWR 基线:是一组快照的集合,用于比较不同时期的性能数据

sql
-- 创建 AWR 基线
EXEC DBMS_WORKLOAD_REPOSITORY.create_baseline(
  start_snap_id => 1000,
  end_snap_id => 1010,
  baseline_name => 'NORMAL_LOAD_BASELINE'
);

-- 查看 AWR 基线
SELECT * FROM dba_hist_baseline;

-- 删除 AWR 基线
EXEC DBMS_WORKLOAD_REPOSITORY.drop_baseline(
  baseline_name => 'NORMAL_LOAD_BASELINE'
);

3. AWR 报告比较

使用 awrddrpt.sql 脚本

sql
-- 比较两个时间段的 AWR 报告
@$ORACLE_HOME/rdbms/admin/awrddrpt.sql

-- 按提示输入:
-- 1. 报告格式
-- 2. 第一个快照起始 ID
-- 3. 第一个快照结束 ID
-- 4. 第二个快照起始 ID
-- 5. 第二个快照结束 ID
-- 6. 报告文件名

分析技巧

  • 比较两个时间段的性能差异
  • 识别性能退化的原因
  • 评估优化措施的效果

4. 自动性能诊断

使用 ADDM(Automatic Database Diagnostic Monitor)

sql
-- 运行 ADDM
EXEC DBMS_ADVISOR.execute_task('ADDM', null, null, 'ADDMDIR', 'BEGIN_SNAPSHOT=1000 END_SNAPSHOT=1010');

-- 查看 ADDM 报告
SELECT DBMS_ADVISOR.get_task_report('ADDM') FROM dual;

分析技巧

  • ADDM 会自动分析 AWR 数据并提供优化建议
  • 优先考虑 ADDM 建议的优化措施
  • 结合人工分析进行综合判断

AWR 报告优化策略

1. SQL 优化

  • 使用绑定变量:减少硬解析
  • 优化 SQL 语句:重写复杂 SQL,使用合适的连接方法
  • 添加索引:为高频查询添加合适的索引
  • 使用分区表:对于大表使用分区技术
  • 调整优化器参数:根据实际情况调整优化器模式

2. 内存优化

  • 调整 SGA 大小:根据数据库负载调整 SGA_TARGET
  • 调整 PGA 大小:根据排序和哈希操作调整 PGA_AGGREGATE_TARGET
  • 优化共享池:适当增加 SHARED_POOL_SIZE
  • 优化缓冲区缓存:根据访问模式调整 DB_CACHE_SIZE

3. I/O 优化

  • 使用 ASM:使用自动存储管理提高 I/O 性能
  • 数据文件分布:将数据文件分布到不同的磁盘组
  • 使用快速存储:对于高频访问的数据使用 SSD
  • 优化表空间:使用合适的表空间类型和块大小
  • 减少 I/O 操作:通过索引优化减少物理读

4. 并发优化

  • 减少锁争用:优化事务设计,减少锁持有时间
  • 使用适当的隔离级别:根据业务需求选择合适的事务隔离级别
  • 优化并行执行:对于大型操作使用适当的并行度
  • 监控并解决死锁:及时发现和解决死锁问题

5. 配置优化

  • 调整初始化参数:根据 Oracle 最佳实践调整参数
  • 优化网络配置:调整网络参数,减少网络延迟
  • 使用连接池:减少连接建立和关闭的开销
  • 定期维护数据库:执行统计信息收集、索引重建等维护操作

常见问题(FAQ)

Q1: AWR 报告生成失败怎么办?

A1: AWR 报告生成失败的常见原因及解决方法:

  • 快照不存在:确保指定的快照 ID 存在
  • 权限不足:确保用户有 SELECT_CATALOG_ROLE 权限
  • 空间不足:检查 SYSAUX 表空间是否有足够空间
  • 参数设置:确保 STATISTICS_LEVEL 参数设置为 TYPICAL 或 ALL

Q2: 如何判断 AWR 报告的时间范围是否合适?

A2: 选择合适的 AWR 报告时间范围:

  • 问题发生时间:确保报告覆盖性能问题发生的时间段
  • 持续时间:一般选择 15-60 分钟的时间段,太短可能无法捕捉到问题,太长可能包含过多无关信息
  • 代表性:选择能够代表正常负载或问题负载的时间段

Q3: 如何分析 AWR 报告中的硬解析比例过高问题?

A3: 分析和解决硬解析比例过高的问题:

  • 检查 Hard Parses/Parse Calls 比值:如果超过 10%,说明硬解析比例过高
  • 原因分析
    • 未使用绑定变量
    • 共享池大小不足
    • CURSOR_SHARING 参数设置不当
  • 解决方法
    • 使用绑定变量重写 SQL
    • 适当增加 SHARED_POOL_SIZE
    • 考虑设置 CURSOR_SHARING=FORCE(谨慎使用)

Q4: 如何使用 AWR 报告识别 I/O 瓶颈?

A4: 识别 I/O 瓶颈的方法:

  • 查看 TOP 等待事件:关注 db file sequential read、db file scattered read 等 I/O 相关等待事件
  • 分析 I/O 统计信息:检查 Tablespace IO Stats 和 File IO Stats 部分
  • 查看物理读和逻辑读:分析 Physical Reads 和 Logical Reads 的比例
  • 检查段统计信息:识别 I/O 密集的热点段

Q5: AWR 报告中的 "Buffer Busy Waits" 等待事件如何解决?

A5: 解决 Buffer Busy Waits 等待事件的方法:

  • 原因分析
    • 热点块竞争
    • 段头竞争
    • 回滚段竞争
  • 解决方法
    • 对于热点块:使用更小的块大小,或考虑分区
    • 对于段头竞争:增加 FREELISTS 和 FREELIST GROUPS
    • 对于回滚段竞争:确保有足够的回滚段
    • 使用自动段空间管理(ASSM)

Q6: 如何使用 AWR 报告评估优化措施的效果?

A6: 评估优化措施效果的方法:

  • 生成优化前后的 AWR 报告:在相同的负载条件下生成报告
  • 比较关键指标
    • DB Time/Elapsed Time 比值
    • TOP 5 等待事件的变化
    • 资源消耗最多的 SQL 的性能变化
    • 实例效率百分比的变化
  • 使用 AWR 比较报告:使用 awrddrpt.sql 生成比较报告
  • 综合评估:结合业务指标(如响应时间、吞吐量)进行综合评估

Q7: AWR 报告中的 "log file sync" 等待事件如何解决?

A7: 解决 log file sync 等待事件的方法:

  • 原因分析
    • LGWR 进程性能不足
    • 重做日志文件所在磁盘 I/O 性能差
    • 事务提交过于频繁
  • 解决方法
    • 使用更快的存储设备存放重做日志
    • 适当增加提交间隔,减少提交频率
    • 确保重做日志文件分布在不同的磁盘上
    • 调整 LOG_BUFFER 参数大小

Q8: 如何减少 AWR 报告的生成时间?

A8: 减少 AWR 报告生成时间的方法:

  • 选择合适的时间范围:不要选择过长的时间范围
  • 使用文本格式:文本格式的报告生成速度比 HTML 格式快
  • 限制 SQL 数量:通过调整 TOPNSQL 参数限制收集的 SQL 数量
  • 使用 Enterprise Manager:对于大型数据库,使用 Enterprise Manager 生成报告可能更高效