AWR报告和ASH报告详解

AWR报告和ASH报告详解

AWR报告 (Automatic Workload Repository Report)

概念

AWR是Oracle数据库内置的性能数据收集和存储仓库,定期收集、处理和维护性能统计信息。

主要功能

  • 性能基线:建立系统性能基准
  • 问题诊断:帮助识别性能瓶颈
  • 容量规划:提供资源使用趋势分析
  • 系统调优:指导数据库优化工作

AWR报告包含的主要内容:

  1. 负载概览

    • 数据库时间消耗分布
    • 各类等待事件统计
    • SQL执行统计信息
  2. 资源使用情况

    • CPU使用率
    • 内存使用情况
    • I/O统计信息
  3. TOP SQL语句

    • 按执行时间排序的SQL
    • 按CPU消耗排序的SQL
    • 按I/O消耗排序的SQL

生成AWR报告的方法:

-- 使用Oracle提供的脚本生成AWR报告
@$ORACLE_HOME/rdbms/admin/awrrpt.sql

-- 生成HTML格式报告
@$ORACLE_HOME/rdbms/admin/awrrpti.sql

-- 生成SQL文本格式报告
@$ORACLE_HOME/rdbms/admin/awrrpt.sql
-- 选择报告类型时选择"text"

AWR关键视图:

-- 查看AWR快照信息
SELECT * FROM dba_hist_snapshot ORDER BY snap_id DESC;

-- 查看TOP SQL
SELECT sql_id, executions, elapsed_time, cpu_time
FROM dba_hist_sqlstat 
WHERE snap_id BETWEEN 100 AND 110
ORDER BY elapsed_time DESC;

ASH报告 (Active Session History Report)

概念

ASH是Oracle数据库中实时采样活动会话信息的功能,每秒采样一次所有活动会话的状态。

主要功能

  • 实时监控:提供实时会话活动信息
  • 瓶颈分析:快速识别当前性能问题
  • 等待事件分析:详细分析会话等待情况
  • SQL性能分析:追踪具体SQL执行情况

ASH报告包含的主要内容:

  1. 会话活动分析

    • 活动会话数量趋势
    • 会话状态分布(ON CPU、WAITING等)
  2. 等待事件分析

    • 最常见的等待事件
    • 等待事件的时间分布
  3. TOP SESSIONS/SQL

    • 消耗资源最多的会话
    • 执行时间最长的SQL

生成ASH报告的方法:

-- 使用Oracle提供的脚本生成ASH报告
@$ORACLE_HOME/rdbms/admin/ashrpt.sql

-- 生成特定时间段的ASH报告
@$ORACLE_HOME/rdbms/admin/ashrpti.sql

ASH关键视图:

-- 查看实时活动会话历史
SELECT * FROM v$active_session_history 
WHERE sample_time > SYSDATE - 1/24  -- 最近1小时
ORDER BY sample_time DESC;

-- 查看历史ASH数据
SELECT * FROM dba_hist_active_sess_history 
WHERE sample_time BETWEEN SYSDATE-1 AND SYSDATE
ORDER BY sample_time DESC;

AWR与ASH的区别对比

特性 AWR ASH
数据采集频率 每小时采集一次快照 每秒采样一次
数据存储位置 SYSAUX表空间 SYSAUX表空间
保留时间 默认保留8天 默认保留1小时(内存),历史数据保留8天
主要用途 历史性能趋势分析 实时性能问题诊断
详细程度 聚合统计信息 详细会话级信息

实际使用场景

使用AWR报告的场景:

  1. 定期性能评估:每月生成AWR报告分析系统性能趋势
  2. 问题回溯分析:分析过去某个时间段的性能问题
  3. 容量规划:基于历史数据规划系统资源
  4. 变更前后对比:系统变更前后的性能对比

使用ASH报告的场景:

  1. 实时问题诊断:当前正在发生的性能问题
  2. 用户投诉响应:快速定位用户反映的性能问题
  3. 短时间性能分析:分析特定操作期间的性能表现
  4. 即时优化验证:验证优化措施的即时效果

示例查询

查找消耗资源最多的SQL:

-- 基于ASH数据查找TOP SQL
SELECT sql_id, COUNT(*) as sample_count,
       ROUND(COUNT(*) * 100.0 / SUM(COUNT(*)) OVER(), 2) as percentage
FROM v$active_session_history
WHERE sample_time > SYSDATE - 1/24  -- 最近1小时
  AND sql_id IS NOT NULL
GROUP BY sql_id
ORDER BY sample_count DESC;

查看具体SQL的等待事件:

-- 分析特定SQL的等待情况
SELECT event, COUNT(*) as wait_count
FROM v$active_session_history
WHERE sql_id = 'your_sql_id_here'
GROUP BY event
ORDER BY wait_count DESC;

通过AWR和ASH报告,DBA可以全面了解数据库的性能状况,快速定位和解决性能问题。

posted @ 2025-08-25 21:16  一刹流云散  阅读(56)  评论(0)    收藏  举报