
好的,我们来对 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_SESSTAT 从 QC 进程的视角,汇总了所有这些并行操作的执行指标。
简而言之,它回答了 DBA 和开发者的问题:“我的这个会话(例如,我刚跑的那个大查询)在并行执行过程中,到底发生了什么事?生成了多少数据?发生了多少通信?”
2. 使用场景
-
并行查询性能诊断:
当一个并行执行的 SQL 语句性能不佳时,通过此视图可以了解时间主要消耗在哪些环节(如分配从属进程、生产数据、消费数据、等待空闲从属进程)。 -
并行度(DOP)调整验证:
验证实际使用的并行度(DOP)是否与期望的(PARALLELHint 或表级设置)一致,并评估不同 DOP 下的效率。 -
资源消耗分析:
了解并行操作处理的数据量(行数、字节数),这对于容量规划和 SQL 调优(例如,判断是否选择了错误的连接方式或驱动表)至关重要。 -
识别并行执行瓶颈:
通过观察生产者和消费者的速度差异,可以识别出执行计划中的不平衡点,例如,一个缓慢的“生产者”会导致所有“消费者”空闲等待。
3. 字段含义详解
以下是 V$PQ_SESSTAT 视图中关键字段的精确说明。这些统计信息在并行操作开始时被重置。
| 字段名 | 数据类型 | 含义说明 |
|---|---|---|
| STATISTIC | VARCHAR2(64) | 并行查询统计项目的名称。这是查询时的主要标识。 |
| VALUE | NUMBER | 该统计项目在当前会话中的累计值。其单位取决于具体的统计项。 |
| CON_ID | NUMBER | 包含此统计信息的容器的 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 Produced 和 Rows Consumed 以及消息/字节统计项直接反映了这个模型的活动。
2. 并行执行服务器池:
实例启动后,会启动一组后台并行服务器进程(PXnn)。Servers Started 和 Servers Shutdown 反映了从池中分配和释放进程的频繁程度。Servers Highwater 显示了池的大小是否需要调整(PARALLEL_MIN_SERVERS, PARALLEL_MAX_SERVERS)。
3. granules):
并行操作的工作单元。Rows Produced 很大程度上取决于被处理的数据块(范围颗粒)或分区(分区颗粒)的数量。
4. RAC 环境下的考虑:
Distr Msgs 和 Local 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 并行查询执行的“黑匣子”。它从协调进程的视角,提供了对整个并行操作生命周期的量化度量。通过它,可以:
- 量化工作负载:精确了解并行操作处理的数据量和使用的资源量。
- 验证配置:确认实际的并行度是否符合预期。
- 诊断瓶颈:识别性能问题是出在数据生产、消费,还是进程间通信环节。
- 评估效率:判断并行执行是否高效,或者是否存在资源浪费(如空闲进程)。
对于需要处理大规模数据、严重依赖并行执行能力的数据仓库、报表系统等环境,熟练掌握 V$PQ_SESSTAT 及其相关视图(特别是 V$PQ_TQSTAT)是进行高级性能调优和容量规划的必备技能。
欢迎关注我的公众号《IT小Chen》
321

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



