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

Oracle V$SESS_IO性能分析指南

在这里插入图片描述
好的,我们来详细解析 Oracle 19c 数据库中一个专注于 I/O 统计的会话级视图:V$SESS_IO

V$SESS_IO 提供了会话级别I/O 相关统计信息的累计值。它是 V$SESSTAT 的一个子集,但专门聚焦于与块访问(逻辑I/O)和物理I/O 最直接相关的关键指标,是快速诊断会话 I/O 行为和性能瓶颈的专用工具。


一、字段含义详解

V$SESS_IO 的字段非常直观,全部围绕 I/O 展开。以下是所有字段的详细说明:

字段名数据类型描述重要说明与性能解读
SIDNUMBER会话标识符 (Session Identifier)。V$SESSION.SID 直接对应,是关联会话上下文的键。
BLOCK_GETSNUMBER会话发起的缓存获取总数。此即 consistent getsdb block gets 的总和。此值基本等同于 V$SESSTAT 中的 session logical reads。是衡量SQL工作量的核心指标。
CONSISTENT_GETSNUMBER一致性读模式下获取的块数。主要用于查询,以保证读取的数据是查询开始时间点的一致快照。高的 CONSISTENT_GETS 通常意味着复杂的查询或大量回滚以构建CR块。
DB_BLOCK_GETSNUMBER在当前模式(CURRENT)下获取的块数。主要用于INSERT, UPDATE, DELETE操作,获取最新的块版本。DML操作频繁的会话此值会较高。
PHYSICAL_READSNUMBER会话从磁盘执行物理读的总次数。这是真正产生磁盘I/O的操作。关键指标。高的 PHYSICAL_READS 表示该会话是I/O压力的主要来源,可能正在执行全表扫描或缺乏索引。
BLOCK_CHANGESNUMBER会话修改的块数。此值等同于 V$SESSTAT 中的 db block changes。代表DML操作的活跃度,与重做日志生成量强相关。
PHYSICAL_WRITESNUMBER会话导致Buffer Cache中的脏块被写入磁盘的总次数注意:这是DBWn进程写入的次数,不一定由该会话直接发起。
PHYSICAL_READS_DIRECTNUMBER会话通过直接路径读方式从磁盘读取的次数(通常绕过Buffer Cache)。常见于并行查询、全表扫描提示(/*+ FULL */)、PCA分配等操作。
PHYSICAL_WRITES_DIRECTNUMBER会话通过直接路径写方式直接写入磁盘的次数(绕过Buffer Cache)。常见于直接路径加载(/*+ APPEND */)、ADG备库的日志应用、数据泵等操作。
OPTIMIZED_PHYSICAL_READSNUMBER通过智能扫描(Exadata)、存储索引等技术优化的物理读次数。Exadata环境特有指标,表示节省的I/O次数。

核心指标关系总结:

  • BLOCK_GETS = CONSISTENT_GETS + DB_BLOCK_GETSsession logical reads
  • 缓存命中率 (Buffer Cache Hit Ratio) 计算公式:
    (BLOCK_GETS - PHYSICAL_READS) / BLOCK_GETS * 100
    注意:会话级命中率可能因单次大批量操作而失真,需谨慎解读。

二、核心原理与底层机制

1. 数据来源与底层基表

V$SESS_IOV$SESSTAT 一样,是一个动态性能视图,其数据来源于 SGA 中为每个会话分配的内存结构。每个会话在 PGA/UGA 中都有一个区域用于存储其 I/O 统计项的计数器。

其底层源是 X$ 表,通常是 X$KSLESI(或类似结构)。这些 X$ 表直接映射了 SGA 中用于存储所有会话 I/O 统计信息的计数器数组。

  • 工作原理
    1. 会话创建:新会话建立时,Oracle 在内存中为其 I/O 统计计数器分配空间并清零。
    2. 活动计数
      • 当会话从 Buffer Cache 获取一个块时,BLOCK_GETSCONSISTENT_GETSDB_BLOCK_GETS 相应增加。
      • 当需要从磁盘读取块到 Buffer Cache 时,PHYSICAL_READS 增加。
      • 当会话修改一个块时,BLOCK_CHANGES 增加。
      • 当 DBWn 进程将属于该会话修改过的脏块写入磁盘时,PHYSICAL_WRITES 增加。
      • 当会话发起直接路径I/O操作时,PHYSICAL_READS_DIRECTPHYSICAL_WRITES_DIRECT 增加。
    3. 实时查询:查询 V$SESS_IO 即直接读取内存中的这些计数器值,性能极高。
    4. 会话终止:会话结束,计数器的内存被释放,记录消失。
2. V$SESSTAT 的关系

V$SESS_IO 可以看作是 V$SESSTAT 的一个预连接、预过滤的专项视图。以下等式在大多数情况下成立:

SELECT s.sid,
       SUM(CASE sn.name WHEN 'session logical reads' THEN ss.value ELSE 0 END) as logical_reads,
       SUM(CASE sn.name WHEN 'physical reads' THEN ss.value ELSE 0 END) as physical_reads,
       SUM(CASE sn.name WHEN 'db block changes' THEN ss.value ELSE 0 END) as block_changes
FROM v$sesstat ss
JOIN v$statname sn ON (ss.statistic# = sn.statistic#)
JOIN v$session s ON (ss.sid = s.sid)
WHERE sn.name IN ('session logical reads', 'physical reads', 'db block changes')
GROUP BY s.sid;

上述查询的结果与查询 V$SESS_IO 是等价的。V$SESS_IO 的优势在于无需关联 V$STATNAME,查询更简单、更快速,专用于I/O分析。


三、常用查询 SQL 示例

  1. 查看所有会话的 I/O 情况,并按物理读排序(快速定位I/O消耗大户)

    SELECT sio.sid,
           s.username,
           s.program,
           s.sql_id,
           sio.block_gets,
           sio.consistent_gets,
           sio.db_block_gets,
           sio.physical_reads,
           ROUND((sio.block_gets - sio.physical_reads) / 
                 NULLIF(sio.block_gets, 0) * 100, 2) AS cache_hit_ratio
    FROM v$sess_io sio
    JOIN v$session s ON sio.sid = s.sid
    WHERE s.type = 'USER'
    ORDER BY sio.physical_reads DESC;
    
  2. 查找正在执行大量直接路径I/O的会话(常见于并行查询或数据加载)

    SELECT sio.sid, s.username, s.module, s.action, s.sql_id,
           sio.physical_reads_direct,
           sio.physical_writes_direct
    FROM v$sess_io sio
    JOIN v$session s ON sio.sid = s.sid
    WHERE (sio.physical_reads_direct > 0 OR sio.physical_writes_direct > 0)
      AND s.status = 'ACTIVE'
    ORDER BY sio.physical_reads_direct DESC;
    
  3. 计算当前会话自身的 I/O 统计(类似于 V$MYSTAT 的I/O版本)

    SELECT sio.block_gets,
           sio.consistent_gets,
           sio.db_block_gets,
           sio.physical_reads,
           sio.block_changes,
           ROUND((sio.block_gets - sio.physical_reads) / 
                 NULLIF(sio.block_gets, 0) * 100, 2) AS cache_hit_ratio_pct
    FROM v$sess_io sio
    WHERE sio.sid = (SELECT sid FROM v$mystat WHERE rownum = 1);
    
  4. 监控高DML负载的会话(检查数据修改频率)

    SELECT sio.sid, s.username, s.program, s.sql_id,
           sio.block_changes, -- 修改的块数
           sio.physical_writes -- 引发的物理写次数
    FROM v$sess_io sio
    JOIN v$session s ON sio.sid = s.sid
    WHERE sio.block_changes > 10000
    ORDER BY sio.block_changes DESC;
    

四、主要应用场景

  1. 快速定位 I/O 瓶颈源
    当数据库出现 I/O 压力时,DBA 可以立即查询 V$SESS_IO,按 PHYSICAL_READSPHYSICAL_READS_DIRECT 降序排列,迅速识别出哪些会话是导致磁盘读操作的“元凶”,并进一步关联 V$SESSION 找到对应的 SQL 语句。

  2. 分析 SQL 语句效率
    结合 V$SESSION.SQL_ID,可以分析高 BLOCK_GETS(逻辑读)的SQL。一条SQL如果逻辑读极高,通常意味着访问方式低效(如全表扫描)、缺少索引或索引选择度不高。

  3. 监控特殊操作
    直接路径操作(*_DIRECT)会绕过 Buffer Cache,对系统的影响与传统I/O不同。此视图可用于监控数据泵导入导出、并行查询、直接路径加载等操作的进行情况和资源消耗。

  4. 评估工作负载特征
    通过观察 CONSISTENT_GETSDB_BLOCK_GETS 的比例,可以了解会话是偏向于查询(OLAP)还是数据修改(OLTP)。

  5. 容量规划与资源评估
    在业务高峰期采集 V$SESS_IO 的快照,可以了解不同应用或模块产生的 I/O 负载,为存储规划、缓存调整提供数据依据。


五、相关视图

  • V$SESSION必须关联的视图。提供会话的上下文信息(用户、程序、状态、当前SQL等)。
  • V$SESSTAT:提供更全面的会话统计信息,V$SESS_IO 是其关于I/O部分的预定义子集。
  • V$STATNAME:统计项名称字典表。如果需要查询 V$SESSTAT 中其他非I/O统计,需要关联此视图。
  • V$SQL / V$SQLAREA:用于通过 SQL_ID 获取正在消耗大量I/O的SQL文本及其执行计划。
  • V$FILESTAT:提供数据文件级别的物理I/O统计,可以与 V$SESS_IO 结合,从会话维度下钻到文件维度。

总结V$SESS_IO 是 Oracle DBA 进行 I/O 性能诊断的“瑞士军刀”。它通过提供一组精炼、高度相关的会话级I/O累计指标,使得定位I/O问题、分析SQL效率、监控特殊负载变得异常直接和高效。在处理任何与磁盘I/O、缓存效率相关的性能问题时,这都应该是首选的查询视图之一。

欢迎关注我的公众号《IT小Chen

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值