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

在这里插入图片描述
好的,我们来对 Oracle 19C 数据库中的 V$PX_SESSION 动态性能视图进行一次全面、深入的详解。这个视图是监控和管理并行查询(Parallel Execution)的核心视图,它清晰地揭示了查询协调器与其并行服务器进程之间的主从关系。

1. 作用与概述

V$PX_SESSION 视图的主要作用是展示当前所有参与并行执行的会话信息,并明确地建立起查询协调器(Query Coordinator, QC)会话与其对应的并行服务器(Parallel Execution Server)会话之间的关联关系

核心价值:它提供了一个关系模型,让你可以:

  • 一目了然地看到哪些用户会话(QC)正在运行并行查询。
  • 轻松地找到一个并行查询具体使用了多少个、以及哪些并行服务器进程。
  • 准确地获取每个并行进程的详细信息(如实际并行度、请求的并行度等)。
  • 这是诊断并行查询性能、监控并行资源使用情况的起点和中心

2. 使用场景

  1. 实时监控并行操作:快速查看数据库中当前有哪些会话正在执行并行操作,以及它们使用的并行度。
  2. 诊断并行性能问题
    • 当一个并行查询运行缓慢时,通过此视图找到其所有从属进程,然后关联 V$SESSION 查看这些进程正在经历什么等待事件(WAIT_EVENT)。
    • 检查实际并行度(DEGREE)是否与期望的一致。
  3. 资源管控:识别出消耗大量并行服务器进程的会话,必要时进行干预。
  4. 关联分析:作为“桥梁”,将用户会话(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_SESSIONV$PX_SESSION 的全局版本,在 RAC 环境中显示所有实例上的并行会话信息。在 RAC 中查询此视图更为常用
    • V$SESSION最重要的关联视图。通过 SIDINST_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$KXFPMSX$KXFPS),但这些是 Oracle 内部的、未公开的。

5. 底层详细原理

  1. 并行查询执行架构

    • 用户会话(QC)解析 SQL 并生成并行执行计划。
    • QC 向并行执行服务器池请求一组进程(数量由 DOP 决定)。
    • Oracle 建立内部通信通道(基于共享内存或网络),并在内存中创建元数据(metadata)来维护 QC 和每个 Server 之间的状态和控制信息。
    • V$PX_SESSION 视图的内容就直接来源于这份内存中的元数据。
  2. 角色(ROLE)的含义

    • COORDINATOR (QC):驱动整个并行操作,将工作分解并分配给 Server,然后接收和聚合结果。
    • PRODUCER:通常负责扫描数据块(全表扫描或索引快速全扫描),并将数据行发送到表队列(Table Queue)。
    • CONSUMER:从表队列接收数据行,执行连接、分组、排序等操作。
    • LEADER:每个服务器组(Producer 组或 Consumer 组)通常有一个 Leader 进程。它负责与 QC 或其他组的 Leader 通信,协调组内工作,并执行部分汇总操作。
  3. 视图的填充

    • 当一个并行操作开始时,Oracle 会自动为 QC 和每个分配的 Server 在内存中的“并行会话表”里创建相应的条目,并填充 QCSID, SERVER_GROUP, ROLE 等关系字段。
    • 当操作结束时,这些条目不会被立即删除,而是会保留一段时间,直到进程被完全清理或重用。

6. 相关知识点介绍

  • 并行度(DOP):决定一个操作使用多少并行进程。REQ_DEGREE 是请求的值,DEGREE 是实际使用的值,两者可能因资源管理器(Resource Manager)或可用进程数(PARALLEL_MAX_SERVERS)等因素而不同。
  • 生产者-消费者模型:这是 Oracle 并行执行最经典的模型。一组进程(Producer)生产数据,另一组进程(Consumer)消费数据,中间通过表队列(Table Queue)交换数据。SERVER_GROUPROLE 字段直接反映了这种模型。
  • RAC 与并行执行:在 RAC 中,QC 可以在一个实例上,而其分配的并行服务器进程可以跨越多个实例,以实现跨节点的并行计算。INST_IDQCINST_ID 字段用于跟踪这种分布。

7. 常用查询 SQL

  1. 查看所有并行查询及其从属进程(最常用)
    此查询是诊断并行问题的起点,清晰地显示了 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#;
    
  2. 查找特定 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;
    
  3. 统计每个并行查询使用的进程数
    用于快速识别哪些查询消耗了最多的并行资源。

    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;
    
  4. 检查并行进程的等待事件
    这是诊断并行查询性能问题的关键,查看进程是否在等待 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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值