
好的,我们来对 Oracle 19C 数据库中的 V$PX_SESSION 动态性能视图进行一次全面、深入的详解。这个视图是监控和管理并行查询(Parallel Execution)的核心视图,它清晰地揭示了查询协调器与其并行服务器进程之间的主从关系。
1. 作用与概述
V$PX_SESSION 视图的主要作用是展示当前所有参与并行执行的会话信息,并明确地建立起查询协调器(Query Coordinator, QC)会话与其对应的并行服务器(Parallel Execution Server)会话之间的关联关系。
核心价值:它提供了一个关系模型,让你可以:
- 一目了然地看到哪些用户会话(QC)正在运行并行查询。
- 轻松地找到一个并行查询具体使用了多少个、以及哪些并行服务器进程。
- 准确地获取每个并行进程的详细信息(如实际并行度、请求的并行度等)。
- 这是诊断并行查询性能、监控并行资源使用情况的起点和中心。
2. 使用场景
- 实时监控并行操作:快速查看数据库中当前有哪些会话正在执行并行操作,以及它们使用的并行度。
- 诊断并行性能问题:
- 当一个并行查询运行缓慢时,通过此视图找到其所有从属进程,然后关联
V$SESSION查看这些进程正在经历什么等待事件(WAIT_EVENT)。 - 检查实际并行度(
DEGREE)是否与期望的一致。
- 当一个并行查询运行缓慢时,通过此视图找到其所有从属进程,然后关联
- 资源管控:识别出消耗大量并行服务器进程的会话,必要时进行干预。
- 关联分析:作为“桥梁”,将用户会话(QC)与其背后的并行执行引擎(Servers)关联起来,以便进行更深入的分析。
3. 字段含义详解
V$PX_SESSION 的字段可以分为三类:标识字段、关系字段和配置/状态字段。下图展示了这些字段在并行查询架构中的相互关系,帮助您直观地理解它们的作用:
flowchart TD
subgraph RAC[Real Application Clusters (RAC) 环境]
QC_Inst[QC_INST_ID]
Server_Inst[SERVER_INST_ID]
end
subgraph Sessions[会话标识]
QC_Sid[QCSID]
QC_Serial[QCSERIAL#]
Server_Sid[SID]
Server_Serial[SERIAL#]
end
subgraph Process[进程角色标识]
Server_Name[SERVER_NAME]
end
subgraph Config[并行度配置]
Req_Degree[REQ_DEGREE]
Degree[DEGREE]
end
subgraph Status[状态信息]
Server_Group[SERVER_GROUP]
Server_Set[SERVER_SET]
end
Sessions --> Config
Sessions --> Status
Process --> Sessions
RAC --> Sessions
下面是每个字段的详细说明:
| 字段名 | 数据类型 | 可选性 | 含义详解 |
| :— | :— | :— | :— |
| SID | NUMBER | | 会话标识符。对于并行服务器进程,此字段是其自身的 SID。对于查询协调器(QC)进程,此字段也是其自身的 SID。 需结合 ROLE 字段来理解。 |
| SERIAL# | NUMBER | | 会话序列号。与 SID 共同使用,用于唯一标识一个会话。 |
| INST_ID | NUMBER | | 实例标识符。在 RAC 环境中,标识此行会话(可能是 QC 或 Server)运行在哪个实例上。 |
| QCSID | NUMBER | | 查询协调器会话标识符。这是本视图最关键的字段之一。对于并行服务器进程,此字段指向其所属的 QC 会话的 SID。对于QC 会话本身,此字段为 NULL。 |
| QCSERIAL# | NUMBER | | 查询协调器会话序列号。与 QCSID 共同使用,唯一标识一个 QC 会话。 |
| QCINST_ID | NUMBER | | 查询协调器实例标识符。在 RAC 环境中,标识 QC 会话运行在哪个实例上。 |
| SERVER_GROUP | NUMBER | | 服务器组号。一个并行执行操作可能被分成多个服务器组(例如,生产者组和消费者组)。此字段标识该进程属于哪个组。 |
| SERVER_SET | NUMBER | | 服务器集号。在一个服务器组内,可能进一步划分集合。 |
| SERVER# | NUMBER | | 服务器在组内的编号。 |
| DEGREE | NUMBER | | 实际使用的并行度。该并行操作实际使用的并行服务器进程数量。 |
| REQ_DEGREE | NUMBER | | 请求的并行度。最初请求的并行度(可能通过 Hint、表属性或参数设置),可能与实际使用的 DEGREE 不同(由于资源限制或优化器决策)。 |
| ROLE | VARCHAR2(10) | LEADER, PRODUCER, CONSUMER, COORDINATOR | 进程在并行执行中的角色。这是理解并行操作模型的关键字段。
- COORDINATOR: 仅用于 QC 行,标识此会话是查询协调器。
- LEADER: 一个并行服务器进程,负责管理组内其他进程并与 QC 通信。
- PRODUCER: 生产者进程(如执行扫描)。
- CONSUMER: 消费者进程(如执行连接、排序)。 |
| SERVER_NAME | VARCHAR2(4) | P000, P001 | 并行服务器进程的名称。对于 QC 行,此字段为 NULL。 |
| CON_ID | NUMBER | | 容器 ID。在多租户环境(CDB)中,标识该行数据属于哪个容器。对于 CDB$ROOT,此值通常为 0。 |
4. 相关视图与基表
-
相关动态性能视图:
GV$PX_SESSION:V$PX_SESSION的全局版本,在 RAC 环境中显示所有实例上的并行会话信息。在 RAC 中查询此视图更为常用。V$SESSION:最重要的关联视图。通过SID和INST_ID关联,可以获取会话的详细信息,如USERNAME,SQL_ID,EVENT,STATE,MACHINE,MODULE等。这是诊断等待事件的关键。V$PX_PROCESS:提供并行服务器进程的操作系统层信息(如SPID- 操作系统进程号)。可以通过SID关联。V$SQL:通过V$SESSION.SQL_ID关联,可以获取正在被并行执行的 SQL 语句的完整文本和执行计划等信息。V$PQ_TQSTAT:提供并行查询过程中表队列(Table Queue)的统计信息,用于分析并行进程间的数据分布是否均衡。
-
基表:
V$PX_SESSION是一个动态性能视图,它没有直接对应的“基表”。- 它的数据来源于数据库实例的内部内存结构。当 QC 请求并行执行时,Oracle 会在内存中创建一系列控制结构来管理 QC 和 PX Servers 之间的关系树。
V$PX_SESSION视图正是这张“关系树”在内存中的映射。它查询的是这些内存结构,以表格形式展示出 QC 和 Server 的父子关系。- 其底层数据来源可能是
X$表(如X$KXFPMS或X$KXFPS),但这些是 Oracle 内部的、未公开的。
5. 底层详细原理
-
并行查询执行架构:
- 用户会话(QC)解析 SQL 并生成并行执行计划。
- QC 向并行执行服务器池请求一组进程(数量由 DOP 决定)。
- Oracle 建立内部通信通道(基于共享内存或网络),并在内存中创建元数据(metadata)来维护 QC 和每个 Server 之间的状态和控制信息。
V$PX_SESSION视图的内容就直接来源于这份内存中的元数据。
-
角色(ROLE)的含义:
- COORDINATOR (QC):驱动整个并行操作,将工作分解并分配给 Server,然后接收和聚合结果。
- PRODUCER:通常负责扫描数据块(全表扫描或索引快速全扫描),并将数据行发送到表队列(Table Queue)。
- CONSUMER:从表队列接收数据行,执行连接、分组、排序等操作。
- LEADER:每个服务器组(Producer 组或 Consumer 组)通常有一个 Leader 进程。它负责与 QC 或其他组的 Leader 通信,协调组内工作,并执行部分汇总操作。
-
视图的填充:
- 当一个并行操作开始时,Oracle 会自动为 QC 和每个分配的 Server 在内存中的“并行会话表”里创建相应的条目,并填充
QCSID,SERVER_GROUP,ROLE等关系字段。 - 当操作结束时,这些条目不会被立即删除,而是会保留一段时间,直到进程被完全清理或重用。
- 当一个并行操作开始时,Oracle 会自动为 QC 和每个分配的 Server 在内存中的“并行会话表”里创建相应的条目,并填充
6. 相关知识点介绍
- 并行度(DOP):决定一个操作使用多少并行进程。
REQ_DEGREE是请求的值,DEGREE是实际使用的值,两者可能因资源管理器(Resource Manager)或可用进程数(PARALLEL_MAX_SERVERS)等因素而不同。 - 生产者-消费者模型:这是 Oracle 并行执行最经典的模型。一组进程(Producer)生产数据,另一组进程(Consumer)消费数据,中间通过表队列(Table Queue)交换数据。
SERVER_GROUP和ROLE字段直接反映了这种模型。 - RAC 与并行执行:在 RAC 中,QC 可以在一个实例上,而其分配的并行服务器进程可以跨越多个实例,以实现跨节点的并行计算。
INST_ID和QCINST_ID字段用于跟踪这种分布。
7. 常用查询 SQL
-
查看所有并行查询及其从属进程(最常用)
此查询是诊断并行问题的起点,清晰地显示了 QC-Server 的关系树。SELECT ss.inst_id, ss.sid, ss.serial#, ss.username, ss.sql_id, ps.qcsid, ps.qcserial#, ps.server_name, ps.role, ps.degree, ps.req_degree FROM gv$px_session ps JOIN gv$session ss ON (ps.sid = ss.sid AND ps.inst_id = ss.inst_id) ORDER BY ps.qcsid, ps.server_group, ps.role, ps.server#; -
查找特定 SQL 的并行执行信息
如果你知道某个SQL_ID运行缓慢且是并行的,可以用此查询找到所有相关会话。SELECT ps.inst_id, ps.sid, ps.serial#, ps.server_name, ps.role, ss.event, -- 等待事件 ss.state -- 会话状态 FROM gv$px_session ps JOIN gv$session ss ON (ps.sid = ss.sid AND ps.inst_id = ss.inst_id) WHERE ss.sql_id = '&sql_id' -- 替换为具体的SQL_ID ORDER BY ps.inst_id, ps.role; -
统计每个并行查询使用的进程数
用于快速识别哪些查询消耗了最多的并行资源。SELECT qcsid, qcserial#, COUNT(*) as number_of_servers FROM gv$px_session WHERE qcsid IS NOT NULL -- 确保只统计Server行 GROUP BY qcsid, qcserial# ORDER BY number_of_servers DESC; -
检查并行进程的等待事件
这是诊断并行查询性能问题的关键,查看进程是否在等待 I/O、锁、CPU 等。SELECT ps.role, ss.event, COUNT(*) as count FROM gv$px_session ps JOIN gv$session ss ON (ps.sid = ss.sid AND ps.inst_id = ss.inst_id) WHERE ps.qcsid IS NOT NULL -- 只查Server进程 GROUP BY ps.role, ss.event ORDER BY count DESC;
希望以上详尽的解释能帮助您完全理解 V$PX_SESSION 视图,并有效地将其用于数据库并行执行的监控和性能优化工作中。
欢迎关注我的公众号《IT小Chen》
2434

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



