
好的,我们来详细解析 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 展开。以下是所有字段的详细说明:
| 字段名 | 数据类型 | 描述 | 重要说明与性能解读 |
|---|---|---|---|
| SID | NUMBER | 会话标识符 (Session Identifier)。 | 与 V$SESSION.SID 直接对应,是关联会话上下文的键。 |
| BLOCK_GETS | NUMBER | 会话发起的缓存获取总数。此即 consistent gets 和 db block gets 的总和。 | 此值基本等同于 V$SESSTAT 中的 session logical reads。是衡量SQL工作量的核心指标。 |
| CONSISTENT_GETS | NUMBER | 在一致性读模式下获取的块数。主要用于查询,以保证读取的数据是查询开始时间点的一致快照。 | 高的 CONSISTENT_GETS 通常意味着复杂的查询或大量回滚以构建CR块。 |
| DB_BLOCK_GETS | NUMBER | 在当前模式(CURRENT)下获取的块数。主要用于INSERT, UPDATE, DELETE操作,获取最新的块版本。 | DML操作频繁的会话此值会较高。 |
| PHYSICAL_READS | NUMBER | 会话从磁盘执行物理读的总次数。这是真正产生磁盘I/O的操作。 | 关键指标。高的 PHYSICAL_READS 表示该会话是I/O压力的主要来源,可能正在执行全表扫描或缺乏索引。 |
| BLOCK_CHANGES | NUMBER | 会话修改的块数。 | 此值等同于 V$SESSTAT 中的 db block changes。代表DML操作的活跃度,与重做日志生成量强相关。 |
| PHYSICAL_WRITES | NUMBER | 会话导致Buffer Cache中的脏块被写入磁盘的总次数。 | 注意:这是DBWn进程写入的次数,不一定由该会话直接发起。 |
| PHYSICAL_READS_DIRECT | NUMBER | 会话通过直接路径读方式从磁盘读取的次数(通常绕过Buffer Cache)。 | 常见于并行查询、全表扫描提示(/*+ FULL */)、PCA分配等操作。 |
| PHYSICAL_WRITES_DIRECT | NUMBER | 会话通过直接路径写方式直接写入磁盘的次数(绕过Buffer Cache)。 | 常见于直接路径加载(/*+ APPEND */)、ADG备库的日志应用、数据泵等操作。 |
| OPTIMIZED_PHYSICAL_READS | NUMBER | 通过智能扫描(Exadata)、存储索引等技术优化的物理读次数。 | Exadata环境特有指标,表示节省的I/O次数。 |
核心指标关系总结:
BLOCK_GETS=CONSISTENT_GETS+DB_BLOCK_GETS≈session logical reads- 缓存命中率 (Buffer Cache Hit Ratio) 计算公式:
(BLOCK_GETS - PHYSICAL_READS) / BLOCK_GETS * 100
注意:会话级命中率可能因单次大批量操作而失真,需谨慎解读。
二、核心原理与底层机制
1. 数据来源与底层基表
V$SESS_IO 和 V$SESSTAT 一样,是一个动态性能视图,其数据来源于 SGA 中为每个会话分配的内存结构。每个会话在 PGA/UGA 中都有一个区域用于存储其 I/O 统计项的计数器。
其底层源是 X$ 表,通常是 X$KSLESI(或类似结构)。这些 X$ 表直接映射了 SGA 中用于存储所有会话 I/O 统计信息的计数器数组。
- 工作原理:
- 会话创建:新会话建立时,Oracle 在内存中为其 I/O 统计计数器分配空间并清零。
- 活动计数:
- 当会话从 Buffer Cache 获取一个块时,
BLOCK_GETS、CONSISTENT_GETS或DB_BLOCK_GETS相应增加。 - 当需要从磁盘读取块到 Buffer Cache 时,
PHYSICAL_READS增加。 - 当会话修改一个块时,
BLOCK_CHANGES增加。 - 当 DBWn 进程将属于该会话修改过的脏块写入磁盘时,
PHYSICAL_WRITES增加。 - 当会话发起直接路径I/O操作时,
PHYSICAL_READS_DIRECT或PHYSICAL_WRITES_DIRECT增加。
- 当会话从 Buffer Cache 获取一个块时,
- 实时查询:查询
V$SESS_IO即直接读取内存中的这些计数器值,性能极高。 - 会话终止:会话结束,计数器的内存被释放,记录消失。
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 示例
-
查看所有会话的 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; -
查找正在执行大量直接路径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; -
计算当前会话自身的 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); -
监控高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;
四、主要应用场景
-
快速定位 I/O 瓶颈源:
当数据库出现 I/O 压力时,DBA 可以立即查询V$SESS_IO,按PHYSICAL_READS或PHYSICAL_READS_DIRECT降序排列,迅速识别出哪些会话是导致磁盘读操作的“元凶”,并进一步关联V$SESSION找到对应的 SQL 语句。 -
分析 SQL 语句效率:
结合V$SESSION.SQL_ID,可以分析高BLOCK_GETS(逻辑读)的SQL。一条SQL如果逻辑读极高,通常意味着访问方式低效(如全表扫描)、缺少索引或索引选择度不高。 -
监控特殊操作:
直接路径操作(*_DIRECT)会绕过 Buffer Cache,对系统的影响与传统I/O不同。此视图可用于监控数据泵导入导出、并行查询、直接路径加载等操作的进行情况和资源消耗。 -
评估工作负载特征:
通过观察CONSISTENT_GETS与DB_BLOCK_GETS的比例,可以了解会话是偏向于查询(OLAP)还是数据修改(OLTP)。 -
容量规划与资源评估:
在业务高峰期采集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》
Oracle V$SESS_IO性能分析指南
740

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



