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

在这里插入图片描述
好的,我们来对 Oracle 19c 数据库中的 V$SESSTAT 动态性能视图进行最全面、最深入的解析。这是 Oracle 性能诊断体系中最为基础和重要的视图之一。

V$SESSTAT 视图提供了会话级别的详细统计信息。它记录了自每个会话启动以来,各种数据库操作的累计发生次数累计值。与展示瞬时状态的 V$SESSION_WAIT 和展示近期速率的 V$SESSMETRIC 不同,V$SESSTAT 提供的是整个会话生命周期的“总量”统计,是进行会话级性能分析和历史问题排查的基石。


一、字段含义详解

V$SESSTAT 的结构非常简单,但内涵极其丰富。它的价值在于将 STATISTIC#V$STATNAME 视图结合,获取有意义的统计项名称。

字段名数据类型描述重要说明与解读
SIDNUMBER会话标识符 (Session Identifier)。V$SESSION.SID 直接对应。这是连接到会话上下文的关键。
STATISTIC#NUMBER统计项编号。这是一个数字代码,用于唯一标识一种统计类型。此字段本身无意义,必须与 V$STATNAME 视图关联才能知道它代表什么统计(如逻辑读、物理读等)。
VALUENUMBER该统计项在对应会话中的累计值这是核心数据。表示从会话启动到查询瞬间,该统计事件发生的总次数或总和。值会一直增长,直到会话结束。

核心统计项(通过 STATISTIC# 关联 V$STATNAME.NAME 获取)举例:

统计项名称 (V$STATNAME.NAME)统计项# (~STATISTIC#)描述性能诊断意义
session logical reads9会话发生的逻辑读总次数(从Buffer Cache中获取的块数)。SQL效率核心指标。值过高通常意味着SQL可能缺少合适的索引,或访问了过多数据。
physical reads40会话从磁盘执行物理读的总次数。I/O压力指标。如果此值很高且session logical reads也很高,说明很多数据不在缓存中,可能需优化SQL或增加缓存。
physical reads direct213直接路径读的总次数(通常绕过Buffer Cache,如全表扫描、并行查询)。
physical writes44物理写总次数。
physical writes direct214直接路径写的总次数(如直接路径加载、ADG日志应用)。
redo size133会话生成的重做日志量(字节)衡量数据库DML操作量的重要指标。大量DELETE/UPDATE/INSERT操作会导致此值激增。
db block changes158会话修改的数据块数量redo size强相关,代表数据变更的活跃度。
sorts (memory)186在内存中完成的排序次数。
sorts (disk)187需要用到临时表空间磁盘的排序次数。关键优化点。如果此值 > 0,说明PGA_AGGREGATE_TARGETSORT_AREA_SIZE可能设置不足,或SQL的ORDER BY/GROUP BY缺少索引。
parse count (total)208SQL解析总次数。
parse count (hard)209硬解析总次数。关键优化点。硬解析消耗大量CPU和Latch资源。此值应尽可能低,通过绑定变量来优化。
user commits214用户提交事务的次数。
user rollbacks215用户回滚事务的次数。
SQL*Net roundtrips to/from client159与客户端网络往返次数。过多往返可能意味着应用程序设计不佳(如循环逐条处理)。
CPU used by this session268会话消耗的CPU时间(单位:厘秒,即1/100秒)衡量CPU消耗的绝对权威指标

注:具体的 STATISTIC# 编号可能因Oracle版本和平台略有差异,始终通过 V$STATNAME 查询确认。


二、核心原理与底层机制

1. 数据来源与底层基表

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

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

  • 工作原理
    1. 会话创建:当一个新的会话建立时,Oracle 会在内存中为其分配一个统计信息计数器数组,并将所有计数器初始化为 0。
    2. 活动计数:每当会话执行一个操作时(如逻辑读、物理读、解析SQL),Oracle 内核就会原子性地递增该会话对应的统计项计数器。
    3. 实时查询:当查询 V$SESSTAT 时,Oracle 直接读取这些内存中的计数器值,因此其性能极高,且数据是实时的。
    4. 会话终止:会话结束时,其对应的内存计数器区域被释放,该会话的记录也从 V$SESSTAT 中消失。
2. V$SYSSTATV$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 示例

  1. 查看当前会话自身的关键统计信息(最常用)

    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;
    
  2. 找出系统中逻辑读最高的会话(用于定位高负载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;
    
  3. 监控硬解析严重的会话

    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;
    
  4. 计算某个会话的缓存命中率(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 %";
    

    注意:会话级命中率通常意义不大,因为可能受到一次全表扫描的严重影响,仅供粗略参考。

  5. 比较会话当前统计信息与会话启动时的差值(需要定期采样)
    此操作较为复杂,通常需要先创建一个临时表保存初始快照,然后比较当前值。更简单的方法是使用 V$SESSMETRIC


四、主要应用场景

  1. 会话级性能分析
    当一个特定会话报告性能问题时,DBA 可以查询其 V$SESSTAT,查看其逻辑读、物理读、CPU时间、排序等指标的总量,快速判断该会话的资源消耗模式和历史行为。

  2. 定位资源消耗源头
    通过将 V$SESSTATV$SESSION 关联,可以找出当前系统中哪些会话(进而关联到哪个用户、哪个程序、哪条SQL)消耗了最多的逻辑读、CPU 或产生了最多的物理 I/O。

  3. 应用逻辑验证
    通过检查 user commitsuser rollbacks 等统计项,可以验证应用程序的事务控制逻辑是否按预期工作。

  4. 历史问题回溯
    虽然 V$SESSTAT 在会话断开后数据消失,但如果结合定期采样工具或监控系统,可以记录会话在整个生命周期内的统计信息变化,用于事后分析。

  5. 作为基准数据
    用于计算比率指标,如缓存命中率(尽管需谨慎解读),或与其他视图结合进行更深入的诊断。


五、相关视图

  • V$STATNAME必须关联的字典视图。提供了 STATISTIC# 到可读名称 (NAME) 和类别 (CLASS) 的映射。
  • V$SESSION:提供会话的上下文信息(用户、程序、状态、当前SQL等),是关联分析的关键。
  • V$SYSSTAT:系统级统计信息视图。
  • V$MYSTAT:当前会话的统计信息视图,是 V$SESSTAT 的子集。
  • V$SESSMETRIC:提供会话级近期(约60秒)的性能指标速率,与 V$SESSTAT累计值形成互补。

总结V$SESSTAT 是 Oracle 数据库性能诊断的“基础档案库”。它忠实记录了每个会话自出生以来的所有“活动痕迹”。虽然它提供的是总量数据,但通过与其他视图(尤其是 V$STATNAMEV$SESSION)的关联,以及在不同时间点进行差值计算,DBA 可以从中挖掘出无比宝贵的性能信息,成为定位和解决数据库性能问题的有力武器。

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

一、DBA最常用的数据字典 dba_data_files:通常用来查询关于数据库文件的信息 dba_db_links:包括数据库中的所有数据库链路,也就是databaselinks。 dba_extents:数据库中所有分区的信息 dba_free_space:所有表空间中的自由分区 dba_indexs:关于数据库中所有索引的描述 dba_ind_columns:在所有表及聚集上压缩索引的列 dba_objects:数据库中所有的对象 dba_rollback_segs:回滚段的描述 dba_segments:所有数据库段分段的存储空间 dba_synonyms:关于同义词的信息查询 dba_tables:数据库中所有数据表的描述 dba_tabespaces:关于表空间的信息 dba_tab_columns:所有表描述、视图以及聚集的列 dba_tab_grants/privs:对象所授予的权限 dba_ts_quotas:所有用户表空间限额 dba_users:关于数据的所有用户的信息 dba_views:数据库中所有视图的文本 二、DBA最常用的动态性能视图 v$datafile:数据库使用的数据文件信息 v$librarycache:共享池中SQL语句的管理信息 v$lock:通过访问数据库会话,设置对象锁的所有信息 v$log:从控制文件中提取有关重做日志组的信息 v$logfile有关实例重置日志组文件名及其位置的信息 v$parameter:初始化参数文件中所有项的值 v$process:当前进程的信息 v$rollname:回滚段信息 v$rollstat:联机回滚段统计信息 v$rowcache:内存中数据字典活动/性能信息 v$session:有关会话的信息 v$sesstat:在v$session中报告当前会话的统计信息 v$sqlarea:共享池中使用当前光标的统计信息,光标是一块内存区域,有Oracle处理SQL语句时打开。 v$statname:在v$sesstat中报告各个统计的含义 v$sysstat:基于当前操作会话进行的系统统计 v$waitstat:出现一个以上会话访问数据库的数据时的详细情况。当有一个以上的会话访问同一信息时,可出现等待情况。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值