
Oracle 19c V$ALL_ACTIVE_SESSION_HISTORY 动态性能视图详解
核心作用
V$ALL_ACTIVE_SESSION_HISTORY 是 Oracle RAC 环境中最重要的性能诊断视图之一,主要用于:
- 跨实例会话监控:提供集群所有实例的活动会话历史
- 全局性能分析:识别集群范围的性能瓶颈和资源争用
- 统一时间线诊断:在单一视图中分析跨实例的会话活动
- 全局阻塞检测:识别跨实例的阻塞链
- RAC调优:优化集群工作负载分布和缓存效率
关键特性
- RAC专属:仅RAC环境中有效(单实例中与V$ACTIVE_SESSION_HISTORY相同)
- 全局视图:聚合所有实例的ASH数据
- 实时历史:保留约1小时的活动会话历史
- 低开销采样:每秒收集一次会话样本
- 多维分析:支持SQL、事件、对象等多维度分析
字段详解(对比V$ACTIVE_SESSION_HISTORY增加INST_ID)
基础标识字段
| 字段名 | 数据类型 | 描述 |
|---|---|---|
INST_ID | NUMBER | 实例ID:RAC集群中的实例标识符(1,2,3…) |
SAMPLE_ID | NUMBER | 采样记录的唯一ID |
SAMPLE_TIME | TIMESTAMP | 采样的精确时间(含毫秒) |
SESSION_ID | NUMBER | 会话标识符 (SID) |
SESSION_SERIAL# | NUMBER | 会话序列号(与SID组合唯一标识会话) |
USER_ID | NUMBER | Oracle用户ID |
SQL_ID | VARCHAR2(13) | 当前执行的SQL ID |
会话状态字段
| 字段名 | 数据类型 | 描述 |
|---|---|---|
SESSION_STATE | VARCHAR2(7) | 会话状态:ON CPU或WAITING |
EVENT | VARCHAR2(128) | 等待事件名称(WAITING状态时) |
WAIT_CLASS | VARCHAR2(64) | 等待事件类别(如:Concurrency, User I/O) |
TIME_WAITED | NUMBER | 本次等待已耗时(微秒) |
对象与执行字段
| 字段名 | 数据类型 | 描述 |
|---|---|---|
CURRENT_OBJ# | NUMBER | 当前访问的对象ID |
CURRENT_FILE# | NUMBER | 当前访问的文件号 |
CURRENT_BLOCK# | NUMBER | 当前访问的块号 |
MODULE | VARCHAR2(48) | 应用模块名称 |
ACTION | VARCHAR2(32) | 应用操作名称 |
RAC特有字段
| 字段名 | 数据类型 | 描述 |
|---|---|---|
BLOCKING_INST_ID | NUMBER | 阻塞会话所在的实例ID |
GC_CURRENT_BLOCK | RAW(1000) | 全局缓存当前块地址 |
GC_CURRENT_GRANT | VARCHAR2(15) | 全局缓存当前授权状态 |
GC_SAVED_BLOCK | RAW(1000) | 全局缓存保存的块地址 |
基表与底层原理
底层结构:WRH$_ACTIVE_SESSION_HISTORY(AWR持久化存储)+ SGA循环缓冲区
数据来源:
- 每个实例的ASH采样器(每秒收集)
- 全局缓存服务(GCS)的块传输信息
- 全局队列服务(GES)的锁信息
工作原理:
- 每个实例独立收集本地ASH数据
- 数据存储在实例本地的SGA循环缓冲区
- 查询时通过集群间通信聚合所有实例数据
- MMON进程定期将数据刷入AWR仓库
- 内存数据保留约1小时,AWR保留8天(默认)
RAC ASH数据流:
核心使用场景(RAC环境)
1. 集群性能概览
SELECT inst_id, wait_class, COUNT(*)
FROM gv$all_active_session_history
GROUP BY inst_id, wait_class;
2. 跨实例阻塞检测
SELECT blocking_inst_id, blocking_session, COUNT(*) AS blocks
FROM gv$all_active_session_history
WHERE blocking_session IS NOT NULL
GROUP BY blocking_inst_id, blocking_session;
3. 全局SQL分析
SELECT sql_id, COUNT(*) AS samples
FROM gv$all_active_session_history
GROUP BY sql_id
ORDER BY samples DESC;
4. 实例负载均衡
SELECT inst_id,
SUM(CASE WHEN session_state='ON CPU' THEN 1 ELSE 0 END) AS cpu,
SUM(CASE WHEN session_state='WAITING' THEN 1 ELSE 0 END) AS wait
FROM gv$all_active_session_history
GROUP BY inst_id;
5. 全局缓存争用分析
SELECT event, current_obj#, COUNT(*)
FROM gv$all_active_session_history
WHERE event LIKE 'gc%'
GROUP BY event, current_obj#;
常用查询 SQL 示例
1. 集群活动会话分布
SELECT
inst_id,
TO_CHAR(sample_time, 'YYYY-MM-DD HH24:MI') AS sample_minute,
COUNT(*) AS active_sessions
FROM gv$all_active_session_history
WHERE sample_time > SYSDATE - 1/24 -- 最近1小时
GROUP BY inst_id, TO_CHAR(sample_time, 'YYYY-MM-DD HH24:MI')
ORDER BY inst_id, sample_minute;
2. 跨实例阻塞链分析
SELECT
sample_time,
inst_id AS blocked_inst,
session_id AS blocked_session,
blocking_inst_id,
blocking_session,
event AS wait_event
FROM gv$all_active_session_history
WHERE blocking_session IS NOT NULL
AND sample_time > SYSDATE - 10/1440; -- 最近10分钟
3. 全局TOP等待事件
SELECT
wait_class,
event,
COUNT(*) AS total_waits,
ROUND(100 * RATIO_TO_REPORT(COUNT(*)) OVER (), 2) AS pct
FROM gv$all_active_session_history
WHERE session_state = 'WAITING'
AND sample_time > SYSDATE - 30/1440 -- 最近30分钟
GROUP BY wait_class, event
ORDER BY total_waits DESC
FETCH FIRST 10 ROWS ONLY;
4. 实例资源使用对比
SELECT
inst_id,
SUM(CASE WHEN session_state='ON CPU' THEN 1 ELSE 0 END) AS cpu_samples,
SUM(CASE WHEN wait_class='User I/O' THEN 1 ELSE 0 END) AS io_samples,
SUM(CASE WHEN wait_class='Concurrency' THEN 1 ELSE 0 END) AS concurrency_samples
FROM gv$all_active_session_history
WHERE sample_time > SYSDATE - 15/1440 -- 最近15分钟
GROUP BY inst_id;
5. 全局缓存效率分析
SELECT
inst_id,
event,
COUNT(*) AS count,
AVG(time_waited) AS avg_wait_micro
FROM gv$all_active_session_history
WHERE event LIKE 'gc%'
AND sample_time > SYSDATE - 60/1440 -- 最近60分钟
GROUP BY inst_id, event
ORDER BY inst_id, count DESC;
6. 热点对象跨实例访问
SELECT
o.owner,
o.object_name,
o.object_type,
ash.inst_id,
COUNT(*) AS accesses
FROM gv$all_active_session_history ash
JOIN dba_objects o ON ash.current_obj# = o.object_id
WHERE ash.sample_time > SYSDATE - 30/1440
GROUP BY o.owner, o.object_name, o.object_type, ash.inst_id
ORDER BY accesses DESC
FETCH FIRST 20 ROWS ONLY;
RAC性能优化实践
1. 识别不平衡负载
SELECT
inst_id,
ROUND(100 * RATIO_TO_REPORT(COUNT(*)) OVER (), 2) AS load_pct
FROM gv$all_active_session_history
WHERE sample_time > SYSDATE - 5/1440
GROUP BY inst_id;
2. 检测跨实例争用
SELECT
event,
COUNT(*) AS total_waits,
COUNT(DISTINCT inst_id) AS affected_instances
FROM gv$all_active_session_history
WHERE wait_class = 'Concurrency'
AND sample_time > SYSDATE - 10/1440
GROUP BY event
HAVING COUNT(DISTINCT inst_id) > 1;
3. 优化全局缓存
SELECT
inst_id,
CASE
WHEN event = 'gc cr block busy' THEN 'CR Block Busy'
WHEN event = 'gc buffer busy' THEN 'Buffer Busy'
ELSE event
END AS gc_event,
current_file#,
current_block#,
COUNT(*) AS waits
FROM gv$all_active_session_history
WHERE event LIKE 'gc%'
AND sample_time > SYSDATE - 30/1440
GROUP BY inst_id, event, current_file#, current_block#
ORDER BY waits DESC;
高级分析技巧
1. 使用AWR的全局ASH数据
SELECT *
FROM dba_hist_active_sess_history
WHERE snap_id = 12345
AND dbid = (SELECT dbid FROM v$database)
AND instance_number IN (1,2,3);
2. 生成RAC ASH报告
-- 生成HTML格式的全局ASH报告
@?/rdbms/admin/ashrpti.sql
-- 生成文本格式报告
@?/rdbms/admin/ashrpt.sql
3. 时间点性能分析
SELECT
inst_id,
session_state,
wait_class,
COUNT(*)
FROM gv$all_active_session_history
WHERE sample_time BETWEEN
TO_TIMESTAMP('2023-01-01 14:00:00', 'YYYY-MM-DD HH24:MI:SS') AND
TO_TIMESTAMP('2023-01-01 14:05:00', 'YYYY-MM-DD HH24:MI:SS')
GROUP BY inst_id, session_state, wait_class;
重要注意事项
-
权限要求:
SELECT ANY DICTIONARYSELECT_CATALOG_ROLE- 在RAC中需要集群级权限
-
性能影响:
- 查询GV$视图会增加集群间通信开销
- 建议添加时间范围过滤条件
- 避免在高峰期间运行复杂查询
-
与V$ACTIVE_SESSION_HISTORY区别:
特性 V$ALL_ACTIVE_SESSION_HISTORY V$ACTIVE_SESSION_HISTORY 数据范围 集群所有实例 仅当前实例 INST_ID字段 包含 不包含 适用环境 RAC专用 单实例/RAC均可 -
数据保留策略:
- 内存:≈1小时(循环缓冲区)
- 磁盘:AWR保留策略(默认8天)
-- 查看AWR设置 SELECT * FROM dba_hist_wr_control; -
诊断工具集成:
-- RAC级别的ADDM报告 @?/rdbms/admin/addmrpti.sql -- 全局AWR报告 @?/rdbms/admin/awrgrpt.sql
优化建议
-
ASH缓冲区大小:
-- 查看ASH缓冲区 SELECT pool, name, bytes/1024/1024 AS size_mb FROM v$sgastat WHERE name LIKE '%ASH%'; -- 调整ASH缓冲区(需谨慎) ALTER SYSTEM SET "_ash_size" = 512M; -
高效查询技巧:
-- 使用样本ID过滤 SELECT * FROM gv$all_active_session_history WHERE sample_id > (SELECT MAX(sample_id)-1000 FROM v$active_session_history); -- 使用分区提示(Oracle 19c+) SELECT /*+ PARALLEL(8) FULL(ash) */ * FROM gv$all_active_session_history ash WHERE sample_time > SYSDATE - 1/24;
通过 V$ALL_ACTIVE_SESSION_HISTORY,DBA 可以全面掌握 Oracle RAC 集群的性能状况,识别跨实例的性能瓶颈,优化工作负载分布,并有效解决全局资源争用问题,确保集群的高效稳定运行。
欢迎关注我的公众号《IT小Chen》
1399

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



