
Oracle 19c V$ASH_INFO 动态性能视图深度解析
核心定位与作用
V$ASH_INFO 是 Active Session History (ASH) 的元数据控制中心,提供 ASH 基础设施的关键配置和状态信息。它是 Oracle 数据库性能诊断的"仪表盘",帮助 DBA 理解 ASH 数据的采集范围、有效性和技术参数。
核心作用:
- ASH 可用性验证:确认 ASH 功能是否启用
- 数据范围确定:识别内存中 ASH 数据的时间跨度
- 采样监控:跟踪采样状态和刷新机制
- 容量规划:评估 ASH 缓冲区使用情况
- 诊断准备:确保性能问题在 ASH 覆盖范围内
- 配置验证:检查 ASH 相关参数设置
📌 关键价值:当数据库出现性能问题时,V$ASH_INFO 能立即确认是否有可用的 ASH 数据用于诊断
核心使用场景
- 性能问题诊断前:确认 ASH 是否覆盖问题时间段
- AWR 报告生成:验证 ASH 数据完整性
- 高负载期监控:评估 ASH 缓冲区是否足够
- 数据库健康检查:例行验证 ASH 功能状态
- 容量规划:决定是否需要增加 ASH 缓冲区
- 迁移/升级验证:确保 ASH 在新环境正常工作
- RAC 环境:跨实例比较 ASH 配置一致性
字段含义详解 (Oracle 19c)
| 字段名 | 数据类型 | 描述 | 关键值/意义 |
|---|---|---|---|
| INST_ID | NUMBER | 实例 ID (RAC 环境) | 单实例始终为 1 |
| FLUSH_STATUS | VARCHAR2(6) | ASH 刷新到磁盘的状态 | ENABLED: 已启用DISABLED: 未启用 (AWR 禁用时) |
| SAMPLE_TIME_OLDEST | DATE | 内存中最旧的 ASH 样本时间 | 可用于诊断的最早时间点 |
| SAMPLE_TIME_NEWEST | DATE | 内存中最新的 ASH 样本时间 | 当前采集的最新样本 |
| TOTAL_BUFFER_SIZE | NUMBER | ASH 环形缓冲区总大小 (样本数) | 由 _ash_size 参数控制 |
| USED_BUFFER_SIZE | NUMBER | 已使用的缓冲区大小 (样本数) | 接近 TOTAL 值表示缓冲区即将满 |
| FLUSH_ELAPSED | NUMBER | 上次刷新耗时(秒) | 衡量刷新性能 |
| FLUSH_SIZE | NUMBER | 上次刷新的样本数 | 每次刷新到 AWR 的数据量 |
| LAST_FLUSH_TIME | DATE | 上次刷新完成时间 | 最近一次磁盘写入时间戳 |
| CON_ID | NUMBER | 容器 ID (CDB/PDB) | 0: CDB$ROOT1+: PDB |
| VERSION | NUMBER | ASH 版本号 | 内部版本标识 |
| ASH_SCHEMA_VERSION | NUMBER | ASH 模式版本 | 数据结构版本 |
| SOURCE_COMP_ID | VARCHAR2(64) | ASH 源组件 | SYS (系统级) |
| SAMPLE_INTERVAL | NUMBER | 采样间隔(毫秒) | 默认 1000 (1秒) |
| MAX_BUFFER_SIZE | NUMBER | 最大缓冲区大小 | 理论最大值 |
| MIN_BUFFER_SIZE | NUMBER | 最小缓冲区大小 | 理论最小值 |
| SHARED_POOL_RESERVED | NUMBER | 共享池中 ASH 保留空间 | ASH 在共享池中的分配情况 |
相关视图
- V$ACTIVE_SESSION_HISTORY:实时 ASH 数据
- DBA_HIST_ACTIVE_SESS_HISTORY:持久化的历史 ASH 数据
- V$ASH_BUFFER_INFO:详细的缓冲区分配信息
- V$SYSAUX_OCCUPANTS:ASH 在 SYSAUX 表空间的使用
- GV$ASH_INFO:RAC 全局视图
- V$SESSION:当前活动会话
- V$SQL:关联 SQL 执行信息
基表与数据来源
底层结构:
- X$KJBL (ASH 缓冲区链表)
- X$KNASHC (ASH 控制结构)
- X$KEWASH (ASH 工作区信息)
数据生成原理:
核心工作原理
1. ASH 数据生命周期
2. 环形缓冲区管理
3. 刷新机制
重要注意事项
-
数据时效性:
- 内存中 ASH 通常保留 1-2 小时
- 磁盘中 ASH 保留由
AWR_RETENTION控制 (默认 8 天)
-
启用条件:
-- 检查诊断包许可 SELECT * FROM DBA_FEATURE_USAGE_STAT WHERE NAME LIKE 'Active%'; -
缓冲区大小公式:
-- 计算实际内存占用 (MB) SELECT (total_buffer_size * 200) / 1024 / 1024 AS buffer_mb FROM v$ash_info;(每个样本约 200 字节)
-
RAC 特性:
- 每个实例有自己的 ASH 缓冲区
- 全局查询需用
GV$ASH_INFO
-
PDB 限制:
- CDB 级别视图包含所有 PDB 数据
- PDB 内查询仅显示自身数据
常用监控与诊断 SQL
1. ASH 可用性检查
SELECT inst_id,
flush_status,
sample_time_oldest,
sample_time_newest,
ROUND((sample_time_newest - sample_time_oldest) * 24 * 60, 1) coverage_min
FROM v$ash_info;
2. 缓冲区使用分析
SELECT total_buffer_size,
used_buffer_size,
ROUND(used_buffer_size/total_buffer_size*100, 1) pct_used,
ROUND((total_buffer_size - used_buffer_size) *
EXTRACT(HOUR FROM (sample_time_newest - sample_time_oldest)) / 60 / used_buffer_size, 1)
AS est_remaining_min
FROM v$ash_info;
3. 刷新性能监控
SELECT last_flush_time,
flush_size,
flush_elapsed,
ROUND(flush_size / NULLIF(flush_elapsed, 0)) samples_per_sec
FROM v$ash_info;
4. 跨 RAC 实例比较
SELECT inst_id,
sample_time_oldest,
sample_time_newest,
used_buffer_size,
total_buffer_size
FROM gv$ash_info
ORDER BY inst_id;
5. ASH 覆盖问题时间
-- 检查问题时间是否在 ASH 范围内
SELECT CASE WHEN TO_DATE('2023-08-15 14:30:00', 'YYYY-MM-DD HH24:MI:SS')
BETWEEN sample_time_oldest AND sample_time_newest
THEN 'COVERED'
ELSE 'NOT COVERED' END coverage_status
FROM v$ash_info;
6. ASH 配置审计
SELECT 'Sample Interval: '||sample_interval||' ms' AS config,
'Buffer: '||used_buffer_size||'/'||total_buffer_size||' samples' AS buffer_info,
'Retention: '||ROUND((sample_time_newest - sample_time_oldest)*24*60)||' min' AS mem_retention
FROM v$ash_info;
最佳实践
1. 自动化 ASH 健康检查
BEGIN
FOR ash IN (SELECT * FROM v$ash_info)
LOOP
IF ash.flush_status = 'DISABLED' THEN
dbms_output.put_line('ASH flushing disabled - enable AWR');
ELSIF ash.used_buffer_size/ash.total_buffer_size > 0.9 THEN
dbms_output.put_line('ASH buffer >90% full - consider increasing _ash_size');
ELSIF (ash.sample_time_newest - ash.sample_time_oldest) < 1/24 THEN
dbms_output.put_line('ASH coverage <1 hour - may be insufficient for diagnostics');
END IF;
END LOOP;
END;
/
2. ASH 缓冲区大小调整
-- 检查当前值
SELECT x.ksppinm, y.ksppstvl
FROM x$ksppi x, x$ksppsv y
WHERE x.indx = y.indx
AND x.ksppinm = '_ash_size';
-- 调整缓冲区大小 (需重启)
ALTER SYSTEM SET "_ash_size"=16777216 SCOPE=spfile; -- 16MB
3. 历史覆盖分析
CREATE TABLE ash_coverage_history AS
SELECT SYSDATE snap_time, i.*,
(sample_time_newest - sample_time_oldest)*24*60 coverage_min
FROM v$ash_info i WHERE 1=0;
-- 每小时快照
BEGIN
DBMS_SCHEDULER.CREATE_JOB(
job_name => 'ASH_COVERAGE_MONITOR',
job_type => 'PLSQL_BLOCK',
job_action => 'INSERT INTO ash_coverage_history
SELECT SYSDATE, i.*,
(i.sample_time_newest - i.sample_time_oldest)*24*60
FROM v$ash_info i',
repeat_interval => 'FREQ=HOURLY',
enabled => TRUE);
END;
/
4. 问题时间点验证函数
CREATE FUNCTION is_ash_covered(p_time DATE) RETURN VARCHAR2 IS
v_oldest DATE;
v_newest DATE;
BEGIN
SELECT sample_time_oldest, sample_time_newest
INTO v_oldest, v_newest
FROM v$ash_info;
RETURN CASE WHEN p_time BETWEEN v_oldest AND v_newest
THEN 'YES' ELSE 'NO' END;
END;
/
-- 使用示例
SELECT is_ash_covered(SYSDATE - 1/24) AS covered_1hr_ago FROM dual;
故障排除指南
通过有效利用 V$ASH_INFO,DBA 可以:
- 确保性能诊断数据的可用性
- 预防性监控 ASH 基础设施
- 优化 ASH 相关配置
- 快速验证问题时间点的数据覆盖
- 为容量规划提供数据支持
建议将此视图集成到日常数据库健康检查脚本中,特别是在关键业务系统性能保障方案中。
欢迎关注我的公众号《IT小Chen》
1086

被折叠的 条评论
为什么被折叠?



