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

在这里插入图片描述
好的,我们来对 Oracle 19C 数据库中的 V$PX_PROCESS 动态性能视图进行一次全面、深入的详解。这个视图是监控和诊断并行查询(Parallel Execution)的关键工具。

1. 作用与概述

V$PX_PROCESS 视图的主要作用是列出当前所有并行执行服务器进程(Parallel Execution Server Processes)的信息。这些进程是 Oracle 为了执行并行操作(如并行查询、并行 DDL、并行 DML)而动态创建和管理的服务进程。

核心价值:通过查询此视图,数据库管理员(DBA)可以实时监控:

  • 当前系统中有多少并行的“奴隶”进程(PX Servers)在运行。
  • 这些进程的状态(繁忙、空闲、被终止等)。
  • 它们属于哪个并行执行会话(通过 SID 关联到 V$SESSION)。
  • 它们在 RAC 环境中的分布情况(通过 INST_ID)。

2. 使用场景

  1. 实时监控并行负载:快速了解数据库当前并行执行的规模和活跃度,判断系统资源(主要是 CPU 和内存)是否被大量并行操作所占用。
  2. 诊断并行查询性能问题
    • 当某个并行查询执行缓慢或挂起时,使用此视图查看为其服务的 PX 服务器进程是否都在正常工作(状态是否为 BUSY),或者是否有进程异常(如 DEAD)。
    • 结合 V$SESSIONV$PX_SESSION,定位占用大量并行资源的具体 SQL 会话。
  3. 排查并行进程相关的错误:当出现 “ORA-12850: Could not allocate slaves” 等错误时,查询此视图可以查看当前已分配的进程数,帮助判断是否已达到 PARALLEL_MAX_SERVERS 参数设置的上限。
  4. 资源调整与容量规划:观察系统在高负载时的并行进程数量,为调整 PARALLEL_MAX_SERVERS, PARALLEL_MIN_SERVERS 等参数提供依据。

3. 字段含义详解

下表详细描述了 V$PX_PROCESS 视图的各个字段。请注意,在 RAC 环境中,应优先查询 GV$PX_PROCESS 以获取所有实例的信息。

| 字段名 | 数据类型 | 可选值(样例) | 含义详解 |
| :— | :— | :— | :— |
| SERVER_NAME | VARCHAR2(4) | P000, P001, …, PZ00 | 并行服务器进程的唯一名称。格式通常为 PxxxQxxx。这是识别单个并行进程的主要标识。 |
| STATUS | VARCHAR2(8) | BUSY, AVAILABLE | 进程的当前状态。这是最重要的字段之一。
- BUSY: 该进程正在为一个并行执行操作工作。
- AVAILABLE: 该进程已创建但当前空闲,等待被分配工作。 |
| SID | NUMBER | 123, 456 | 会话标识符 (Session Identifier)此 SID 指的是该并行服务器进程自身的 SID,而不是其所属的查询协调器(QC)的 SID。可以通过此字段与 V$SESSION 视图进行关联。 |
| SERIAL# | NUMBER | 12345, 67890 | 会话序列号 (Session Serial Number)。与 SID 一起使用,用于唯一标识一个会话。用于和 V$SESSION 关联时防止匹配到重复使用的 SID。 |
| QCINST_ID | VARCHAR2(16) | 1, 2 | 查询协调器实例 ID (Query Coordinator Instance ID)。在 RAC 环境中,标识发起此并行查询的协调器会话运行在哪个实例上。 |
| QCSID | NUMBER | 789, 101 | 查询协调器会话 ID (Query Coordinator Session ID)标识发起并控制此并行查询的“主”会话(即用户会话)的 SID。这是与用户会话关联的关键字段。 |
| INST_ID | NUMBER | 1, 2 | 实例标识符 (Instance Identifier)。在 RAC 环境中,标识这个并行服务器进程本身运行在哪个实例上。 |
| DEGREE | NUMBER | 4, 8, 16 | 并行度 (Degree of Parallelism)。此并行操作实际使用的并行度。 |
| REQ_DEGREE | NUMBER | 4, 8, 16 | 请求的并行度 (Requested Degree of Parallelism)。最初请求的并行度(可能与实际使用的 DEGREE 不同)。 |
| SERVICE_NAME | VARCHAR2(64) | SYS$BACKGROUND | 此进程所关联的 Oracle 服务名称。通常为 SYS$BACKGROUND。 |
| SPID | VARCHAR2(24) | 12345, 67890 | 操作系统进程标识符 (Operating System Process Identifier)。这是在操作系统级别(如 Linux 上的 PID)上对应的进程号。可用于在操作系统层面对进程进行监控(如使用 topps 命令)。 |
| PROGRAM | VARCHAR2(64) | ORACLE.EXE (P000) | 操作系统程序名称。通常显示为 ORACLE.EXE 后跟并行进程名(如 (P000))。 |
| CPU | NUMBER | 123 | 此进程消耗的 CPU 时间(单位:百分之一秒)。 |
| CON_ID | NUMBER | 0, 3 | 容器 ID。在多租户环境(CDB)中,标识该行数据属于哪个容器。对于 CDB$ROOT,此值通常为 0。 |


4. 相关视图与基表

  • 相关动态性能视图

    • GV$PX_PROCESSV$PX_PROCESS 的全局版本,在 RAC 环境中显示所有实例上的并行进程信息。在 RAC 中查询此视图更为常用
    • V$SESSION最重要的关联视图。通过 V$PX_PROCESS.SID = V$SESSION.SID 可以获取并行进程的详细会话信息(如 USERNAME, SQL_ID, EVENT, STATE 等)。
    • V$PX_SESSION:提供并行会话的统计信息,重点关注查询协调器(QC) 和其从属进程(Servers)之间的关系。其 SID 字段对应的是 QC 的 SID(即 V$PX_PROCESS.QCSID)。
    • V$PQ_SYSSTAT:显示并行查询子系统的总体统计信息,如“Servers Busy”、“Servers Idle”等,提供了一个汇总视角。
    • V$SQL_AREA / V$SQL:通过 V$SESSION.SQL_ID 关联,可以找到正在被并行执行的 SQL 语句的具体内容。
  • 基表

    • V$PX_PROCESS 是一个动态性能视图,它没有直接对应的“基表”
    • 它的数据直接来源于内存中的数据库实例状态信息。Oracle 在共享池(Shared Pool)或大型池(Large Pool)中维护着并行执行服务器的状态和控制结构。V$PX_PROCESS 视图正是反映了这份在内存中管理的进程信息。
    • 其底层数据可以看作是 X$ 表(如可能关联到 X$KXFPProcess),但这些 X$ 表是 Oracle 内部的、未公开的,不建议用户直接查询。

5. 底层详细原理

  1. 并行查询架构

    • 当一个查询被并行化时,会产生一个 查询协调器(Query Coordinator, QC) 进程。QC 就是用户的会话进程,它负责规划和控制并行执行,并最终汇总结果返回给用户。
    • QC 会向并行执行服务器池请求一组 并行服务器进程(Parallel Execution Servers, PX Servers)。这些进程的名称通常是 P000, P001, …, P999
  2. 进程分配与管理

    • 当实例启动时,会根据 PARALLEL_MIN_SERVERS 参数预创建一些空闲的 PX 服务器进程(状态为 AVAILABLE)。
    • 当 QC 请求并行执行时,Oracle 会尝试分配所需的进程。如果有足够的空闲进程,则直接使用;如果没有,则会动态创建新的进程,直到总数不超过 PARALLEL_MAX_SERVERS 的限制。
    • 一旦被分配,这些进程的状态变为 BUSY,并开始执行 QC 分配的工作单元(如表块范围扫描、哈希连接的一部分等)。
    • 工作完成后,进程不会立即被销毁,而是状态变回 AVAILABLE,并保留一段时间(由 PARALLEL_SERVER_IDLE_TIME 参数控制),以备下一个并行操作使用。超时后,进程会被终止以释放系统资源。
  3. V$PX_PROCESS 的数据来源

    • Oracle 内核维护着一个内部数据结构(可以想象为一个数组或链表),用来跟踪每一个 PX 服务器进程的详细信息(状态、SID、服务的 QC 等)。
    • V$PX_PROCESS 视图就是这个内部结构的一个只读映射。查询该视图相当于直接读取这个内存中的“进程状态表”。这就是为什么它能实时反映并行进程情况的原因。

6. 相关知识点介绍

  • 并行度(DOP):决定一个操作使用多少并行进程。可以由 Hint(/*+ PARALLEL(4) */)、表属性(PARALLEL 8)或系统参数(PARALLEL_DEGREE_POLICY)决定。
  • 参数
    • PARALLEL_MAX_SERVERS:决定一个实例最多能同时存在多少个 PX 服务器进程。这是最重要的调优参数之一。
    • PARALLEL_MIN_SERVERS:实例启动时预创建的空闲进程数,用于减少并行操作开始的延迟。
    • PARALLEL_SERVER_IDLE_TIME:空闲进程在被终止前可以存活的时间。
  • 进程与线程:在 Linux/Unix 上,PX Servers 通常是独立的操作系统进程(可见 SPID)。在 Windows 上,它们可能是操作系统线程。
  • 大型池(Large Pool):为了减少对共享池的争用,Oracle 推荐配置 Large Pool 来为 PX Servers 之间的通信(称为消息缓冲区)分配内存。如果未配置 Large Pool,则会使用共享池。

7. 常用查询 SQL

  1. 查看当前所有并行服务器进程(RAC 环境)

    SELECT inst_id, server_name, status, sid, qcinst_id, qcsid, degree, spid
    FROM gv$px_process
    ORDER BY inst_id, server_name;
    
  2. 查看繁忙的并行进程及其对应的 QC 信息(非常实用)
    此查询将并行进程与其所属的用户会话和正在执行的 SQL 关联起来。

    SELECT pp.inst_id as "PX Inst",
           pp.server_name,
           pp.status as "PX Status",
           ss.sid as "QC SID",
           ss.serial# as "QC Serial#",
           ss.username as "QC User",
           ss.module as "QC Module",
           ss.sql_id as "QC SQL ID",
           sq.sql_text
    FROM gv$px_process pp
    JOIN gv$session ss ON (pp.qcsid = ss.sid AND pp.qcinst_id = ss.inst_id)
    LEFT JOIN gv$sqlarea sq ON (ss.sql_id = sq.sql_id AND ss.inst_id = sq.inst_id)
    WHERE pp.status = 'BUSY'
    ORDER BY pp.inst_id, pp.server_name;
    
  3. 统计各实例上并行进程的状态

    SELECT inst_id,
           status,
           COUNT(*) as process_count
    FROM gv$px_process
    GROUP BY inst_id, status
    ORDER BY inst_id, status;
    
  4. 检查是否接近 PARALLEL_MAX_SERVERS 限制

    SELECT inst_id, COUNT(*) as current_servers
    FROM gv$px_process
    GROUP BY inst_id
    ORDER BY inst_id;
    

    将查询结果与每个实例的 PARALLEL_MAX_SERVERS 参数值进行比较。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值