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

在这里插入图片描述
好的,我们来对 Oracle 19C 数据库中的 V$PQ_SESSTAT 动态性能视图进行一次极其详细和准确的解析。这个视图是诊断和优化 Oracle 并行查询(Parallel Query, PQ)性能的核心工具。


1. 作用与概述

V$PQ_SESSTAT 视图的主要作用是提供当前会话(Session)级别的并行查询执行统计信息。它记录了在当前会话中发生的所有并行执行操作(如并行 DML, DDL, 查询)的详细运行时指标。

核心概念:并行查询执行统计
当 SQL 语句以并行方式执行时,Oracle 会创建一个并行执行服务器组。一个协调进程(Query Coordinator, QC)负责将工作分发给多个并行服务器进程(Parallel Execution Servers, PXnnn),并汇总它们的结果。V$PQ_SESSTATQC 进程的视角,汇总了所有这些并行操作的执行指标。

简而言之,它回答了 DBA 和开发者的问题:“我的这个会话(例如,我刚跑的那个大查询)在并行执行过程中,到底发生了什么事?生成了多少数据?发生了多少通信?”


2. 使用场景

  1. 并行查询性能诊断
    当一个并行执行的 SQL 语句性能不佳时,通过此视图可以了解时间主要消耗在哪些环节(如分配从属进程、生产数据、消费数据、等待空闲从属进程)。

  2. 并行度(DOP)调整验证
    验证实际使用的并行度(DOP)是否与期望的(PARALLEL Hint 或表级设置)一致,并评估不同 DOP 下的效率。

  3. 资源消耗分析
    了解并行操作处理的数据量(行数、字节数),这对于容量规划和 SQL 调优(例如,判断是否选择了错误的连接方式或驱动表)至关重要。

  4. 识别并行执行瓶颈
    通过观察生产者和消费者的速度差异,可以识别出执行计划中的不平衡点,例如,一个缓慢的“生产者”会导致所有“消费者”空闲等待。


3. 字段含义详解

以下是 V$PQ_SESSTAT 视图中关键字段的精确说明。这些统计信息在并行操作开始时被重置。

字段名数据类型含义说明
STATISTICVARCHAR2(64)并行查询统计项目的名称。这是查询时的主要标识。
VALUENUMBER该统计项目在当前会话中的累计值。其单位取决于具体的统计项。
CON_IDNUMBER包含此统计信息的容器的 ID。在 CDB 环境中,指示该数据属于哪个 PDB。

核心统计项(STATISTIC 列的值)详解:

统计项名称含义说明
Servers Busy当前繁忙的并行服务器进程的平均数量。这是一个快照值,用于观察并行度利用率。
Servers Idle当前空闲的并行服务器进程的平均数量
Servers Started在本会话的并行操作中,已启动的并行服务器进程的总数
Servers Shutdown在本会话的并行操作中,已关闭的并行服务器进程的总数
Servers Highwater并行服务器进程同时活跃数量的峰值。这反映了实际达到的最大并行度。
Queries Initiated在本会话中发起的并行查询操作的总次数
DML Initiated在本会话中发起的并行 DML 操作的总次数
DDL Initiated在本会话中发起的并行 DDL 操作的总次数
DFO Trees已执行的并行操作数据流对象(Data Flow Object)树的总数。一个复杂的并行查询可能包含多个 DFO 树。
Local Msgs Sent在实例内发送的进程间消息总数(在 RAC 中,指同一实例内进程间通信)。
Local Msgs Recv’d在实例内接收的进程间消息总数
Distr Msgs Sent跨实例发送的进程间消息总数(在 RAC 中,指通过互联网络跨实例通信)。
Distr Msgs Recv’d跨实例接收的进程间消息总数
Data Bytes Sent通过并行进程间通信发送的数据总字节数
Data Bytes Recv’d通过并行进程间通信接收的数据总字节数
Rows Produced所有并行服务器进程产生的数据行的总数。这是衡量并行操作“工作量”的关键指标。
Rows Consumed所有并行服务器进程消费的数据行的总数。在并行操作中,一个进程的“生产”就是另一个进程的“消费”。

4. 相关视图与基表

  • 相关动态性能视图

    • V$PQ_TQSTAT:这是最相关的视图。它提供了表队列(Table Queue) 级别的详细统计信息。V$PQ_SESSTAT 是会话级汇总,而 V$PQ_TQSTAT 是操作内部分析,可以查看每个生产者和消费者的具体工作负载分布,用于识别倾斜。
    • GV$PX_SESSION:显示当前所有活跃的并行执行服务器的实时状态信息(如正在执行什么 SQL,属于哪个 QC)。
    • GV$PX_PROCESS:提供所有并行服务器进程和后端进程的状态信息。
    • V$SQL / V$SQLAREA:用于找到正在被并行执行的 SQL 语句的详细信息。
    • V$SESSTAT:会话级的通用统计信息,其中也包含一些并行查询相关的统计项。
  • 底层基表与原理
    V$PQ_SESSTAT 是一个动态性能视图,其数据不直接来源于普通的磁盘基表

    • 数据源:其数据由查询协调器(QC)进程在并行操作执行过程中动态收集和汇总。这些统计信息存储在 QC 进程的 PGA 内存中。
    • 生命周期:这些统计信息是会话级别的。它们在该会话的第一次并行操作时被初始化,并在会话期间持续累积。会话断开后,这些统计信息将被丢弃
    • 重置:执行 ALTER SYSTEM FLUSH SHARED_POOL 不会重置此视图。但会话内部的统计会在新的并行操作开始时重置(历史观察得出的行为,并非总是绝对)。
    • 底层结构:其底层来源于内部的 X$ 表(如 X$KXFPCSESSTAT),这些表在查询时动态映射到 QC 进程 PGA 中的内存结构。

5. 详细原理与知识点

1. 生产者-消费者模型:
Oracle 并行执行采用此模型。一组进程(生产者)扫描表或索引,处理数据,并通过表队列(Table Queue) 将数据行发送给另一组进程(消费者)进行进一步处理(如连接、排序、聚合)。V$PQ_SESSTAT 中的 Rows ProducedRows Consumed 以及消息/字节统计项直接反映了这个模型的活动。

2. 并行执行服务器池:
实例启动后,会启动一组后台并行服务器进程(PXnn)。Servers StartedServers Shutdown 反映了从池中分配和释放进程的频繁程度。Servers Highwater 显示了池的大小是否需要调整(PARALLEL_MIN_SERVERS, PARALLEL_MAX_SERVERS)。

3. granules):
并行操作的工作单元。Rows Produced 很大程度上取决于被处理的数据块(范围颗粒)或分区(分区颗粒)的数量。

4. RAC 环境下的考虑:
Distr MsgsLocal Msgs 统计项在 RAC 中至关重要。高的 Distr Msgs 值可能意味着大量的跨实例通信,如果互联网络带宽不足或延迟高,这将成为主要性能瓶颈。理想情况是使用服务(Services)将工作路由到数据所在的实例( affinity)。

5. 性能调优启示:

  • Servers Idle:可能表示并行度设置过高(DOP),或者执行计划存在严重倾斜,导致某些并行服务器很早就完成了工作。
  • Rows Produced 远大于最终结果集:表明并行执行的操作(如全表扫描、连接)产生了大量中间结果,可能需要优化 SQL 或调整执行计划(例如,添加筛选条件)。
  • 巨大的 Data Bytes Sent:表明大量数据在进程间流动,需要关注 IPC 或 RAC 互联网络的性能。

6. 常用查询SQL

1. 查看当前会话的所有并行查询统计信息(基础查询)

SELECT statistic, value
FROM v$pq_sesstat
ORDER BY statistic;

2. 获取关键性能指标的精简视图

SELECT 
    SUM(CASE statistic WHEN 'Servers Highwater' THEN value END) AS max_dop,
    SUM(CASE statistic WHEN 'Rows Produced' THEN value END) AS rows_produced,
    SUM(CASE statistic WHEN 'Rows Consumed' THEN value END) AS rows_consumed,
    ROUND(SUM(CASE statistic WHEN 'Data Bytes Sent' THEN value END) / 1024 / 1024, 2) AS data_mb_sent,
    SUM(CASE statistic WHEN 'Queries Initiated' THEN value END) AS parallel_queries,
    SUM(CASE statistic WHEN 'DML Initiated' THEN value END) AS parallel_dml
FROM v$pq_sesstat;

3. 监控RAC环境中的跨实例通信(判断是否存在Interconnect瓶颈)

SELECT 
    SUM(CASE statistic WHEN 'Distr Msgs Sent' THEN value END) AS inter_instance_msgs_sent,
    SUM(CASE statistic WHEN 'Distr Msgs Recv''d' THEN value END) AS inter_instance_msgs_received,
    SUM(CASE statistic WHEN 'Local Msgs Sent' THEN value END) AS intra_instance_msgs_sent,
    SUM(CASE statistic WHEN 'Local Msgs Recv''d' THEN value END) AS intra_instance_msgs_received,
    ROUND( 
      (SUM(CASE statistic WHEN 'Distr Msgs Sent' THEN value END) + 
       SUM(CASE statistic WHEN 'Distr Msgs Recv''d' THEN value END)) / 
      NULLIF( (SUM(CASE statistic WHEN 'Local Msgs Sent' THEN value END) + 
               SUM(CASE statistic WHEN 'Local Msgs Recv''d' THEN value END) +
               SUM(CASE statistic WHEN 'Distr Msgs Sent' THEN value END) + 
               SUM(CASE statistic WHEN 'Distr Msgs Recv''d' THEN value END) ), 0 ) * 100, 2
    ) AS pct_inter_instance_comm
FROM v$pq_sesstat;
-- 如果 pct_inter_instance_comm 很高,说明查询可能未使用Affinity,导致大量跨节点通信。

4. 在运行并行查询后立即检查其影响(诊断单个查询)

-- 1. 运行你的并行查询之前,先记录当前统计值(可選,需要创建临时表)
-- CREATE GLOBAL TEMPORARY TABLE my_pq_stats AS SELECT statistic, value FROM v$pq_sesstat;

-- 2. 运行你的并行查询
-- SELECT /*+ PARALLEL(8) */ * FROM very_large_table WHERE ...;

-- 3. 查询执行后的统计信息增量
SELECT 
    curr.statistic,
    curr.value AS current_value
    --, prev.value AS previous_value
    --, curr.value - NVL(prev.value, 0) AS delta_value -- 如果记录了之前的值
FROM v$pq_sesstat curr
-- LEFT JOIN my_pq_stats prev ON curr.statistic = prev.statistic
WHERE curr.value > 0
ORDER BY curr.value DESC;

总结

V$PQ_SESSTAT 视图是 Oracle 并行查询执行的“黑匣子”。它从协调进程的视角,提供了对整个并行操作生命周期的量化度量。通过它,可以:

  1. 量化工作负载:精确了解并行操作处理的数据量和使用的资源量。
  2. 验证配置:确认实际的并行度是否符合预期。
  3. 诊断瓶颈:识别性能问题是出在数据生产、消费,还是进程间通信环节。
  4. 评估效率:判断并行执行是否高效,或者是否存在资源浪费(如空闲进程)。

对于需要处理大规模数据、严重依赖并行执行能力的数据仓库、报表系统等环境,熟练掌握 V$PQ_SESSTAT 及其相关视图(特别是 V$PQ_TQSTAT)是进行高级性能调优和容量规划的必备技能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值