
好的,我们来对 Oracle 19C 数据库中的 V$PX_SESSTAT 动态性能视图进行一次全面、深入的详解。这个视图是监控并行查询(Parallel Execution)性能指标的关键视图,它将并行执行统计信息精确到会话级别。
1. 作用与概述
V$PX_SESSTAT 视图的主要作用是提供与会话(Session)相关的并行执行(Parallel Execution)统计信息。它扩展了 V$SESSTAT 视图,专门聚焦于并行操作相关的统计项。
核心价值:
- 会话级粒度:允许你查看单个会话(无论是查询协调器 QC 还是并行服务器进程)在并行执行过程中产生的各种度量指标。
- 性能分析:通过分析这些统计信息(如消息发送/接收数量、处理的行数、字节数等),可以评估并行操作的效率、数据分布均衡性以及资源消耗。
- 问题诊断:帮助诊断并行查询特有的性能问题,如数据倾斜、进程间通信瓶颈等。
2. 使用场景
- 并行查询性能分析:在并行查询执行后,查看其处理的数据量(行数、字节数)、通信量(消息数)等统计信息,以评估执行效率和规模。
- 识别数据倾斜:比较同一个并行操作下不同服务器进程的
rows processed统计信息。如果数值差异巨大,表明存在数据倾斜,某些进程处理了更多数据,导致整体性能下降。 - 诊断通信开销:查看
messages sent和messages received等统计项,如果其数值异常高,可能表明并行操作的设计或执行计划导致过多的进程间通信开销。 - 资源消耗分析:将并行统计信息与 SQL 执行计划结合,理解每个并行操作步骤的资源消耗情况。
3. 字段含义详解
V$PX_SESSTAT 的结构与 V$SESSTAT 完全相同,但其 STATISTIC# 指向的是特定于并行执行的统计项。
| 字段名 | 数据类型 | 可选性 | 含义详解 |
| :— | :— | :— | :— |
| SID | NUMBER | | 会话标识符。这是该统计信息所属会话的 SID。该会话可以是查询协调器(QC),也可以是并行服务器进程。 |
| STATISTIC# | NUMBER | | 统计项目编号。这是一个数字代码,对应到 V$STATNAME 视图中的 STATISTIC#,用于标识具体的统计项目(如消息数、行数等)。 |
| VALUE | NUMBER | | 该统计项目的值。自会话开始以来(或自统计项重置以来)该统计指标的累积值。 |
| CON_ID | NUMBER | | 容器 ID。在多租户环境(CDB)中,标识该行数据属于哪个容器。对于 CDB$ROOT,此值通常为 0。 |
📊 关键并行统计项(STATISTIC#)详解
要理解 V$PX_SESSTAT,必须结合 V$STATNAME 视图来查询统计项的名称。以下是一些最重要且常见的并行执行统计项:
| 统计项名称 (来自 V$STATNAME) | 统计项含义详解 |
|---|---|
| messages sent | 该会话发送的 IPC 消息总数。高值可能表示大量进程间通信。 |
| messages received | 该会话接收的 IPC 消息总数。 |
| bytes sent via IPC | 通过 IPC 发送的总字节数。衡量并行操作中数据传输量的关键指标。 |
| bytes received via IPC | 通过 IPC 接收的总字节数。 |
| rows processed | 该会话处理的总行数。用于诊断数据倾斜的黄金指标。比较同一 QC 下各 Server 进程的此值,若差异大则说明负载不均。 |
| no work - trivial query | 因查询过于简单而未启动并行执行的次数。 |
| DFO trees parallelized | 被并行化的数据流操作树(DFO Trees)的数量。 |
| Local DFOs parallelized | 在本地实例上被并行化的 DFO 数量。 |
| Parallel operations not downgraded | 未发生降级( downgrade)的并行操作数量。 |
| Parallel operations downgraded to serial | 被降级为串行执行的并行操作数量。 |
| Parallel operations downgraded 1 to 25 pct | 并行度降级到 1% - 25% 的并行操作数量。 |
| …downgraded 25 to 50 pct | 并行度降级到 25% - 50% 的并行操作数量。 |
| …downgraded 50 to 75 pct | 并行度降级到 50% - 75% 的并行操作数量。 |
| …downgraded 75 to 99 pct | 并行度降级到 75% - 99% 的并行操作数量。 |
4. 相关视图与基表
-
相关动态性能视图:
V$STATNAME:必须关联的视图。通过V$PX_SESSTAT.STATISTIC# = V$STATNAME.STATISTIC#来获取统计项的可读名称。V$SESSTAT:V$PX_SESSTAT的“超集”。它包含所有会话的所有统计信息,其中一部分是并行统计信息。V$PX_SESSTAT可以看作是V$SESSTAT的一个针对并行统计信息的子集或特定视角。V$PX_SESSION:最重要的关联视图。通过SID关联,可以确定一个会话是 QC 还是 Server,以及它属于哪个 QC。这是将统计信息与会话角色和关系关联起来的关键。V$SESSION:通过SID关联,可以获取会话的其它信息,如USERNAME,SQL_ID,EVENT等。GV$PX_SESSTAT:V$PX_SESSTAT的全局版本,用于 RAC 环境。
-
基表:
V$PX_SESSTAT是一个动态性能视图,它没有直接对应的“基表”。- 它的数据来源于数据库实例的内部内存结构。每个会话的 PGA/UGA 中都有一个区域用于存储其各种活动的统计计数器。
- Oracle 内核在并行执行的各个关键步骤(如发送消息、处理一行数据)中,会递增相应会话的计数器。
V$PX_SESSTAT和V$SESSTAT视图直接读取这些内存中的计数器值并将其呈现出来。- 其底层数据来源是
X$表(如可能关联到X$KSUSGIF或X$KSLED),但这些是 Oracle 内部的、未公开的。
5. 底层详细原理
-
统计信息的维护:
- 每个数据库会话在内存中都有自己的一套统计信息计数器。
- 当会话执行一个操作时,例如,一个并行服务器进程通过 IPC 发送一条消息,Oracle 内核代码会执行类似
ksuestat_increment(session_state, KSUSEMESSSENT)的操作,将会话结构中messages sent对应的计数器加 1。 - 这个过程开销极低,因为它只是在内存中进行一个简单的加法操作。
-
视图的查询:
- 当你查询
V$PX_SESSTAT时,Oracle 会遍历所有活跃会话的内存结构,收集那些属于并行执行类别的统计项(STATISTIC#在特定范围内)的计数器当前值。 - 这些值是从实例启动开始或最后一次统计信息重置以来的累积值。
- 当你查询
-
与会话生命周期的关系:
- 统计信息与会话绑定。当会话终止时,其统计信息也随之消失。
- 对于并行服务器进程,这些进程是短暂存在的。因此,
V$PX_SESSTAT中并行服务器进程的统计信息只代表了该进程本次被使用期间产生的指标。
6. 相关知识点介绍
- IPC(Inter-Process Communication):并行服务器进程之间以及进程与 QC 之间通过 IPC 机制进行通信,通常使用共享内存(在同一实例内)或网络(在 RAC 实例间)。
messages sent和bytes sent等统计项直接反映了这种通信的 volume。 - 数据流操作树(DFO Tree):并行执行计划被组织成 DFO 树,其中每个操作(如扫描、连接、排序)可以由一组并行进程执行。
DFO trees parallelized统计项对此进行计数。 - 并行降级(Parallel Downgrade):当系统无法提供请求的并行度所需的全部资源(如空闲的并行服务器进程)时,Oracle 会自动降低实际使用的并行度。相关统计项记录了降级发生的频率和严重程度。
- 数据倾斜(Data Skew):这是并行执行中常见的性能杀手。指数据在并行进程之间分布不均匀,导致某些进程很忙而其他进程很早空闲。通过比较同一 QC 下各 Server 进程的
rows processed值可以轻松识别此问题。
7. 常用查询 SQL
-
查看特定并行会话的所有统计信息
此查询将V$PX_SESSTAT与V$STATNAME关联,得到可读的报告。SELECT sn.name, ss.value FROM v$px_sesstat ss, v$statname sn WHERE ss.sid = &target_sid -- 替换为你想查询的会话SID AND ss.statistic# = sn.statistic# AND sn.name LIKE '%parallel%' OR sn.name LIKE '%ipc%' -- 过滤出并行相关统计项 ORDER BY ss.value DESC; -
分析特定并行查询的数据倾斜(非常重要)
这个查询能找到某个 QC 的所有 Server 进程,并显示它们各自处理的行数,是诊断负载均衡的关键。SELECT ps.server_name, ps.role, ss.value as rows_processed FROM v$px_session ps, v$px_sesstat ss, v$statname sn WHERE ps.qcsid = &qc_sid -- 替换为查询协调器的SID AND ps.sid = ss.sid AND ss.statistic# = sn.statistic# AND sn.name = 'rows processed' ORDER BY ps.server_name; -
比较同一查询下不同进程的IPC流量
SELECT ps.server_name, sn.name, ss.value FROM v$px_session ps, v$px_sesstat ss, v$statname sn WHERE ps.qcsid = &qc_sid AND ps.sid = ss.sid AND ss.statistic# = sn.statistic# AND sn.name IN ('bytes sent via IPC', 'bytes received via IPC') ORDER BY ps.server_name, sn.name; -
查找系统中IPC通信量最大的会话
SELECT s.sid, s.username, s.sql_id, sn.name, ss.value FROM v$px_sesstat ss, v$statname sn, v$session s WHERE ss.statistic# = sn.statistic# AND ss.sid = s.sid AND sn.name = 'bytes sent via IPC' AND ss.value > 0 ORDER BY ss.value DESC;
希望以上详尽的解释能帮助您完全理解 V$PX_SESSTAT 视图,并有效地将其用于数据库并行执行的深度性能分析和优化工作中。
欢迎关注我的公众号《IT小Chen》

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



