AWR报告和ASH报告详解
AWR报告和ASH报告详解
AWR报告 (Automatic Workload Repository Report)
概念
AWR是Oracle数据库内置的性能数据收集和存储仓库,定期收集、处理和维护性能统计信息。
主要功能
- 性能基线:建立系统性能基准
- 问题诊断:帮助识别性能瓶颈
- 容量规划:提供资源使用趋势分析
- 系统调优:指导数据库优化工作
AWR报告包含的主要内容:
-
负载概览
- 数据库时间消耗分布
- 各类等待事件统计
- SQL执行统计信息
-
资源使用情况
- CPU使用率
- 内存使用情况
- I/O统计信息
-
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报告包含的主要内容:
-
会话活动分析
- 活动会话数量趋势
- 会话状态分布(ON CPU、WAITING等)
-
等待事件分析
- 最常见的等待事件
- 等待事件的时间分布
-
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报告的场景:
- 定期性能评估:每月生成AWR报告分析系统性能趋势
- 问题回溯分析:分析过去某个时间段的性能问题
- 容量规划:基于历史数据规划系统资源
- 变更前后对比:系统变更前后的性能对比
使用ASH报告的场景:
- 实时问题诊断:当前正在发生的性能问题
- 用户投诉响应:快速定位用户反映的性能问题
- 短时间性能分析:分析特定操作期间的性能表现
- 即时优化验证:验证优化措施的即时效果
示例查询
查找消耗资源最多的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可以全面了解数据库的性能状况,快速定位和解决性能问题。