
好的,我们来对 Oracle 19c 数据库中的 V$SESSTAT 动态性能视图进行最全面、最深入的解析。这是 Oracle 性能诊断体系中最为基础和重要的视图之一。
V$SESSTAT 视图提供了会话级别的详细统计信息。它记录了自每个会话启动以来,各种数据库操作的累计发生次数或累计值。与展示瞬时状态的 V$SESSION_WAIT 和展示近期速率的 V$SESSMETRIC 不同,V$SESSTAT 提供的是整个会话生命周期的“总量”统计,是进行会话级性能分析和历史问题排查的基石。
一、字段含义详解
V$SESSTAT 的结构非常简单,但内涵极其丰富。它的价值在于将 STATISTIC# 与 V$STATNAME 视图结合,获取有意义的统计项名称。
| 字段名 | 数据类型 | 描述 | 重要说明与解读 |
|---|---|---|---|
| SID | NUMBER | 会话标识符 (Session Identifier)。 | 与 V$SESSION.SID 直接对应。这是连接到会话上下文的关键。 |
| STATISTIC# | NUMBER | 统计项编号。这是一个数字代码,用于唯一标识一种统计类型。 | 此字段本身无意义,必须与 V$STATNAME 视图关联才能知道它代表什么统计(如逻辑读、物理读等)。 |
| VALUE | NUMBER | 该统计项在对应会话中的累计值。 | 这是核心数据。表示从会话启动到查询瞬间,该统计事件发生的总次数或总和。值会一直增长,直到会话结束。 |
核心统计项(通过 STATISTIC# 关联 V$STATNAME.NAME 获取)举例:
| 统计项名称 (V$STATNAME.NAME) | 统计项# (~STATISTIC#) | 描述 | 性能诊断意义 |
|---|---|---|---|
| session logical reads | 9 | 会话发生的逻辑读总次数(从Buffer Cache中获取的块数)。 | SQL效率核心指标。值过高通常意味着SQL可能缺少合适的索引,或访问了过多数据。 |
| physical reads | 40 | 会话从磁盘执行物理读的总次数。 | I/O压力指标。如果此值很高且session logical reads也很高,说明很多数据不在缓存中,可能需优化SQL或增加缓存。 |
| physical reads direct | 213 | 直接路径读的总次数(通常绕过Buffer Cache,如全表扫描、并行查询)。 | |
| physical writes | 44 | 物理写总次数。 | |
| physical writes direct | 214 | 直接路径写的总次数(如直接路径加载、ADG日志应用)。 | |
| redo size | 133 | 会话生成的重做日志量(字节)。 | 衡量数据库DML操作量的重要指标。大量DELETE/UPDATE/INSERT操作会导致此值激增。 |
| db block changes | 158 | 会话修改的数据块数量。 | 与redo size强相关,代表数据变更的活跃度。 |
| sorts (memory) | 186 | 在内存中完成的排序次数。 | |
| sorts (disk) | 187 | 需要用到临时表空间磁盘的排序次数。 | 关键优化点。如果此值 > 0,说明PGA_AGGREGATE_TARGET或SORT_AREA_SIZE可能设置不足,或SQL的ORDER BY/GROUP BY缺少索引。 |
| parse count (total) | 208 | SQL解析总次数。 | |
| parse count (hard) | 209 | 硬解析总次数。 | 关键优化点。硬解析消耗大量CPU和Latch资源。此值应尽可能低,通过绑定变量来优化。 |
| user commits | 214 | 用户提交事务的次数。 | |
| user rollbacks | 215 | 用户回滚事务的次数。 | |
| SQL*Net roundtrips to/from client | 159 | 与客户端网络往返次数。 | 过多往返可能意味着应用程序设计不佳(如循环逐条处理)。 |
| CPU used by this session | 268 | 会话消耗的CPU时间(单位:厘秒,即1/100秒)。 | 衡量CPU消耗的绝对权威指标。 |
注:具体的 STATISTIC# 编号可能因Oracle版本和平台略有差异,始终通过 V$STATNAME 查询确认。
二、核心原理与底层机制
1. 数据来源与底层基表
V$SESSTAT 是一个动态性能视图,其数据来源于 SGA 中为每个会话分配的内存结构。每个会话在 PGA/UGA 中都有一个区域用于存储其所有统计项的计数器。
其底层源是 X$ 表,通常是 X$KSLEST(或类似结构)。这些 X$ 表直接映射了 SGA 中用于存储所有会话统计信息的计数器数组。
- 工作原理:
- 会话创建:当一个新的会话建立时,Oracle 会在内存中为其分配一个统计信息计数器数组,并将所有计数器初始化为 0。
- 活动计数:每当会话执行一个操作时(如逻辑读、物理读、解析SQL),Oracle 内核就会原子性地递增该会话对应的统计项计数器。
- 实时查询:当查询
V$SESSTAT时,Oracle 直接读取这些内存中的计数器值,因此其性能极高,且数据是实时的。 - 会话终止:会话结束时,其对应的内存计数器区域被释放,该会话的记录也从
V$SESSTAT中消失。
2. 与 V$SYSSTAT 和 V$MYSTAT 的关系
V$SESSTAT:每个会话的统计信息。SUM(V$SESSTAT.VALUE)=V$SYSSTAT.VALUE。V$SYSSTAT:整个实例的统计信息,是所有会话统计信息的汇总。V$MYSTAT:当前会话的统计信息。它是V$SESSTAT的一个特殊视角,只显示当前你登录的会话的数据,相当于WHERE SID = (SELECT SID FROM V$MYSTAT)(实际上V$MYSTAT是基于V$SESSTAT的)。
3. 统计信息分组
Oracle 将统计项分为不同的类别(Class),这在 V$STATNAME 视图中有 CLASS 字段对应。常见类别包括:
- 1: User(用户)
- 4: Redo(重做)
- 8: Enqueue(队列)
- 16: Cache(缓存)
- 32: OS(操作系统)
- 64: Parallel(并行)
- 128: SQL(SQL)
- 256: Debug(调试)
三、常用查询 SQL 示例
-
查看当前会话自身的关键统计信息(最常用)
SELECT sn.name, ss.value FROM v$mystat ss, v$statname sn WHERE ss.statistic# = sn.statistic# AND sn.name IN ( 'session logical reads', 'physical reads', 'physical reads direct', 'redo size', 'sorts (memory)', 'sorts (disk)', 'parse count (hard)', 'CPU used by this session' ) ORDER BY ss.value DESC; -
找出系统中逻辑读最高的会话(用于定位高负载SQL)
SELECT s.sid, s.username, s.osuser, s.module, s.program, s.sql_id, sn.name, ss.value 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 = 'session logical reads' AND s.type = 'USER' -- 只关注用户会话 AND s.status = 'ACTIVE' ORDER BY ss.value DESC; -
监控硬解析严重的会话
SELECT s.sid, s.username, s.program, s.sql_id, ss.value AS hard_parses 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 = 'parse count (hard)' AND ss.value > 100 -- 硬解析次数超过100 ORDER BY ss.value DESC; -
计算某个会话的缓存命中率(Session Buffer Cache Hit Ratio)
SELECT sid, SUM(CASE name WHEN 'session logical reads' THEN value ELSE 0 END) logical_reads, SUM(CASE name WHEN 'physical reads' THEN value ELSE 0 END) physical_reads, ROUND( (SUM(CASE name WHEN 'session logical reads' THEN value ELSE 0 END) - SUM(CASE name WHEN 'physical reads' THEN value ELSE 0 END)) / SUM(CASE name WHEN 'session logical reads' THEN value ELSE 0 END) * 100, 2 ) "Hit Ratio %" FROM (SELECT ss.sid, sn.name, ss.value FROM v$sesstat ss JOIN v$statname sn ON ss.statistic# = sn.statistic# WHERE sn.name IN ('session logical reads', 'physical reads')) GROUP BY sid HAVING SUM(CASE name WHEN 'session logical reads' THEN value ELSE 0 END) > 0 ORDER BY "Hit Ratio %";注意:会话级命中率通常意义不大,因为可能受到一次全表扫描的严重影响,仅供粗略参考。
-
比较会话当前统计信息与会话启动时的差值(需要定期采样)
此操作较为复杂,通常需要先创建一个临时表保存初始快照,然后比较当前值。更简单的方法是使用V$SESSMETRIC。
四、主要应用场景
-
会话级性能分析:
当一个特定会话报告性能问题时,DBA 可以查询其V$SESSTAT,查看其逻辑读、物理读、CPU时间、排序等指标的总量,快速判断该会话的资源消耗模式和历史行为。 -
定位资源消耗源头:
通过将V$SESSTAT与V$SESSION关联,可以找出当前系统中哪些会话(进而关联到哪个用户、哪个程序、哪条SQL)消耗了最多的逻辑读、CPU 或产生了最多的物理 I/O。 -
应用逻辑验证:
通过检查user commits、user rollbacks等统计项,可以验证应用程序的事务控制逻辑是否按预期工作。 -
历史问题回溯:
虽然V$SESSTAT在会话断开后数据消失,但如果结合定期采样工具或监控系统,可以记录会话在整个生命周期内的统计信息变化,用于事后分析。 -
作为基准数据:
用于计算比率指标,如缓存命中率(尽管需谨慎解读),或与其他视图结合进行更深入的诊断。
五、相关视图
V$STATNAME:必须关联的字典视图。提供了STATISTIC#到可读名称 (NAME) 和类别 (CLASS) 的映射。V$SESSION:提供会话的上下文信息(用户、程序、状态、当前SQL等),是关联分析的关键。V$SYSSTAT:系统级统计信息视图。V$MYSTAT:当前会话的统计信息视图,是V$SESSTAT的子集。V$SESSMETRIC:提供会话级近期(约60秒)的性能指标速率,与V$SESSTAT的累计值形成互补。
总结:V$SESSTAT 是 Oracle 数据库性能诊断的“基础档案库”。它忠实记录了每个会话自出生以来的所有“活动痕迹”。虽然它提供的是总量数据,但通过与其他视图(尤其是 V$STATNAME 和 V$SESSION)的关联,以及在不同时间点进行差值计算,DBA 可以从中挖掘出无比宝贵的性能信息,成为定位和解决数据库性能问题的有力武器。
欢迎关注我的公众号《IT小Chen》
1565

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



