面试宝典:介绍下Oracle数据库动态性能视图V$ALL_ACTIVE_SESSION_HISTORY

在这里插入图片描述

Oracle 19c V$ALL_ACTIVE_SESSION_HISTORY 动态性能视图详解

核心作用

V$ALL_ACTIVE_SESSION_HISTORY 是 Oracle RAC 环境中最重要的性能诊断视图之一,主要用于:

  1. 跨实例会话监控:提供集群所有实例的活动会话历史
  2. 全局性能分析:识别集群范围的性能瓶颈和资源争用
  3. 统一时间线诊断:在单一视图中分析跨实例的会话活动
  4. 全局阻塞检测:识别跨实例的阻塞链
  5. RAC调优:优化集群工作负载分布和缓存效率

关键特性

  • RAC专属:仅RAC环境中有效(单实例中与V$ACTIVE_SESSION_HISTORY相同)
  • 全局视图:聚合所有实例的ASH数据
  • 实时历史:保留约1小时的活动会话历史
  • 低开销采样:每秒收集一次会话样本
  • 多维分析:支持SQL、事件、对象等多维度分析

字段详解(对比V$ACTIVE_SESSION_HISTORY增加INST_ID)

基础标识字段
字段名数据类型描述
INST_IDNUMBER实例ID:RAC集群中的实例标识符(1,2,3…)
SAMPLE_IDNUMBER采样记录的唯一ID
SAMPLE_TIMETIMESTAMP采样的精确时间(含毫秒)
SESSION_IDNUMBER会话标识符 (SID)
SESSION_SERIAL#NUMBER会话序列号(与SID组合唯一标识会话)
USER_IDNUMBEROracle用户ID
SQL_IDVARCHAR2(13)当前执行的SQL ID
会话状态字段
字段名数据类型描述
SESSION_STATEVARCHAR2(7)会话状态:ON CPUWAITING
EVENTVARCHAR2(128)等待事件名称(WAITING状态时)
WAIT_CLASSVARCHAR2(64)等待事件类别(如:Concurrency, User I/O)
TIME_WAITEDNUMBER本次等待已耗时(微秒)
对象与执行字段
字段名数据类型描述
CURRENT_OBJ#NUMBER当前访问的对象ID
CURRENT_FILE#NUMBER当前访问的文件号
CURRENT_BLOCK#NUMBER当前访问的块号
MODULEVARCHAR2(48)应用模块名称
ACTIONVARCHAR2(32)应用操作名称
RAC特有字段
字段名数据类型描述
BLOCKING_INST_IDNUMBER阻塞会话所在的实例ID
GC_CURRENT_BLOCKRAW(1000)全局缓存当前块地址
GC_CURRENT_GRANTVARCHAR2(15)全局缓存当前授权状态
GC_SAVED_BLOCKRAW(1000)全局缓存保存的块地址

基表与底层原理

底层结构WRH$_ACTIVE_SESSION_HISTORY(AWR持久化存储)+ SGA循环缓冲区

数据来源

  1. 每个实例的ASH采样器(每秒收集)
  2. 全局缓存服务(GCS)的块传输信息
  3. 全局队列服务(GES)的锁信息

工作原理

  1. 每个实例独立收集本地ASH数据
  2. 数据存储在实例本地的SGA循环缓冲区
  3. 查询时通过集群间通信聚合所有实例数据
  4. MMON进程定期将数据刷入AWR仓库
  5. 内存数据保留约1小时,AWR保留8天(默认)

RAC ASH数据流

实例1 ASH采样
V$ALL_ACTIVE_SESSION_HISTORY
实例2 ASH采样
实例N ASH采样
AWR仓库

核心使用场景(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;

重要注意事项

  1. 权限要求

    • SELECT ANY DICTIONARY
    • SELECT_CATALOG_ROLE
    • 在RAC中需要集群级权限
  2. 性能影响

    • 查询GV$视图会增加集群间通信开销
    • 建议添加时间范围过滤条件
    • 避免在高峰期间运行复杂查询
  3. 与V$ACTIVE_SESSION_HISTORY区别

    特性V$ALL_ACTIVE_SESSION_HISTORYV$ACTIVE_SESSION_HISTORY
    数据范围集群所有实例仅当前实例
    INST_ID字段包含不包含
    适用环境RAC专用单实例/RAC均可
  4. 数据保留策略

    • 内存:≈1小时(循环缓冲区)
    • 磁盘:AWR保留策略(默认8天)
    -- 查看AWR设置
    SELECT * FROM dba_hist_wr_control;
    
  5. 诊断工具集成

    -- RAC级别的ADDM报告
    @?/rdbms/admin/addmrpti.sql
    
    -- 全局AWR报告
    @?/rdbms/admin/awrgrpt.sql
    

优化建议

  1. 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;
    
  2. 高效查询技巧

    -- 使用样本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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值