
好的,我们来对 Oracle 19C 数据库中的 V$PX_PROCESS_SYSSTAT 动态性能视图进行一次全面、深入的详解。这个视图是监控并行查询(Parallel Execution)整体系统状态和健康状况的“仪表盘”。
1. 作用与概述
V$PX_PROCESS_SYSSTAT 视图的主要作用是提供关于并行执行服务器进程(Parallel Execution Server Processes)的汇总统计信息。它不像 V$PX_PROCESS 那样显示单个进程的细节,而是从系统级角度展示总量、比率和累积值,用于评估并行查询子系统的整体性能、负载和效率。
核心价值:通过查询此视图,数据库管理员(DBA)可以:
- 快速了解并行服务器的利用率(繁忙 vs. 空闲)。
- 诊断因并行进程不足导致的性能问题或错误。
- 监控并行查询的生命周期统计信息,如启动的服务器总数、被终止的空闲进程数等。
- 为调整
PARALLEL_MAX_SERVERS等关键参数提供数据支持。
2. 使用场景
- 系统级并行负载监控:快速查看当前时刻有多少并行进程处于“繁忙”和“空闲”状态,判断系统并行处理的活跃程度。
- 容量规划与参数调优:
- 当出现 “ORA-12850: Could not allocate slaves” 错误时,查看 “Servers Highwater” 统计项,判断历史峰值是否已达到
PARALLEL_MAX_SERVERS的限制,从而决定是否需要增大该参数。 - 观察 “Servers Started” 和 “Servers Shutdown” 的计数,如果值很高且增长很快,说明进程频繁创建和销毁,可能需要调整
PARALLEL_MIN_SERVERS或PARALLEL_SERVER_IDLE_TIME来减少开销。
- 当出现 “ORA-12850: Could not allocate slaves” 错误时,查看 “Servers Highwater” 统计项,判断历史峰值是否已达到
- 性能问题诊断:结合等待事件视图,如果发现并行查询性能不佳,可以检查 “Server Busy Loop” 等统计信息,判断是否在协调器-服务器通信上存在瓶颈。
- 实时健康检查:在运维或高峰期,定期运行查询脚本,监控并行子系统的关键指标。
3. 字段含义详解
V$PX_PROCESS_SYSSTAT 视图的结构非常简单,但每条统计信息都至关重要。
| 字段名 | 数据类型 | 可选性 | 含义详解 |
| :— | :— | :— | :— |
| STATISTIC | VARCHAR2(64) | | 统计项目的名称。这是描述统计内容的文本标识符。详见下方【关键统计项详解】。 |
| VALUE | NUMBER | | 该统计项目对应的数值。其含义完全取决于 STATISTIC 字段。 |
| CON_ID | NUMBER | | 容器 ID。在多租户环境(CDB)中,标识该行数据属于哪个容器。对于 CDB$ROOT,此值通常为 0。 |
📊 关键统计项(STATISTIC)详解
| 统计项名称 (STATISTIC) | 含义详解 |
|---|---|
| Servers Busy | 当前处于“繁忙”状态的并行服务器进程的数量。这些进程正在 actively 为某个并行执行操作工作。这是最重要的实时监控指标之一。 |
| Servers Idle | 当前处于“空闲”状态的并行服务器进程的数量。这些进程已启动但正在等待被分配工作。 |
| Servers Started | 自实例启动以来,累计创建的并行服务器进程的总数。这是一个累积值,只增不减。 |
| Servers Shutdown | 自实例启动以来,累计被终止的并行服务器进程的总数。通常,空闲进程超过 PARALLEL_SERVER_IDLE_TIME 后会被终止。 |
| Servers Highwater | 自实例启动以来,并行服务器进程数量的峰值(历史最大值)。此值非常重要,用于判断 PARALLEL_MAX_SERVERS 的设置是否合理。如果此值非常接近 PARALLEL_MAX_SERVERS,说明曾几乎用尽所有可用进程。 |
| Server Sessions | (已废弃)为了向后兼容而保留。 |
| Memory Chunks Allocated | 为并行执行分配的内存块数量。并行操作(尤其是在进程间传递数据)需要分配内存缓冲区,通常来自大型池(Large Pool)。 |
| Memory Chunks Freed | 被释放的并行执行内存块数量。 |
| Memory Chunks Current | 当前已分配且未释放的并行执行内存块数量。 |
| Memory Chunks HWM | 并行执行内存块数量的历史峰值。 |
| Buffers Allocated | 为并行执行分配的缓冲区数量。 |
| Buffers Freed | 被释放的缓冲区数量。 |
| Buffers Current | 当前已分配且未释放的缓冲区数量。 |
| Buffers HWM | 缓冲区数量的历史峰值。 |
| Oldest Start Time | (已废弃)为了向后兼容而保留。 |
| Server Busy Loop | 内部协调循环的执行次数。这是一个底层性能计数器,值过高可能表明协调逻辑存在瓶颈。 |
| Server Loop | 内部循环的执行次数。 |
4. 相关视图与基表
-
相关动态性能视图:
GV$PX_PROCESS_SYSSTAT:V$PX_PROCESS_SYSSTAT的全局版本,在 RAC 环境中显示所有实例上的并行系统统计信息。V$PX_PROCESS:提供单个并行服务器进程的详细信息(如 SID, Status, QC信息)。V$PX_PROCESS_SYSSTAT是其汇总视图。V$PQ_SYSSTAT:这是一个非常容易混淆的视图。它包含一些类似的统计信息(如Servers Busy),但主要关注并行查询队列(Statement Queuing)的特性。两者互为补充,应一起查询。V$SYSSTAT:包含更广泛的系统统计信息,其中有一些与并行操作相关(如queries parallelized,DML parallelized等)。V$PARAMETER:用于查看与并行执行相关的参数当前值(如parallel_max_servers,parallel_min_servers),以便与V$PX_PROCESS_SYSSTAT的统计值进行对比分析。
-
基表:
V$PX_PROCESS_SYSSTAT是一个动态性能视图,它没有直接对应的“基表”。- 它的数据来源于数据库实例的内部内存结构。Oracle 内核在共享内存中维护了一系列计数器,用于跟踪并行执行子系统的各种活动(如进程创建、销毁、状态变更、内存分配等)。
- 查询此视图实质上就是读取这些内存中的计数器的当前值。其底层来源可能是
X$表(如X$KXFPCSST或类似结构),但这些是 Oracle 内部的、未公开的。
5. 底层详细原理
-
统计信息的维护:
- Oracle 并行执行引擎在其代码的关键路径上设置了多个计数器。
- 例如,每当一个并行服务器进程被
p000衍生(spawn)出来时,“Servers Started” 计数器就会加 1。当该进程被终止时,“Servers Shutdown” 计数器加 1。 - 同样,内核会定期扫描所有并行进程的状态,更新 “Servers Busy” 和 “Servers Idle” 的计数。
-
“Highwater Mark”(高水位线)的原理:
- “Servers Highwater” 这样的统计项是通过一个简单的算法维护的:每当“当前进程总数”发生变化时,系统就会将其与之前记录的峰值进行比较。如果新的总数更高,就用新值更新峰值记录。
- 这个过程发生在内存中,效率极高。
-
内存管理统计:
- 当并行操作需要进程间通信(Inter-Process Communication, IPC)时(例如,生产者消费者模型下的数据传递),它会从 大型池(Large Pool)(如果配置)或共享池(Shared Pool)中分配内存块(Buffers/Chunks)。
Memory Chunks Allocated等统计项就是跟踪这些内存分配操作,帮助 DBA 判断大型池的大小(LARGE_POOL_SIZE)是否设置合理。如果分配和释放非常频繁,或者高水位线很高,可能意味着需要更大的池。
-
数据实时性:
- 由于这些计数器直接在内存中更新,
V$PX_PROCESS_SYSSTAT视图提供了近乎实时的系统状态快照。查询该视图几乎没有性能开销,因为它只是简单地显示当前内存中的值。
- 由于这些计数器直接在内存中更新,
6. 相关知识点介绍
- 并行服务器进程池:Oracle 维护一个可重用的并行服务器进程池。
PARALLEL_MIN_SERVERS设置初始池大小,PARALLEL_MAX_SERVERS设置上限。空闲进程在超过PARALLEL_SERVER_IDLE_TIME后会被清理。 - 大型池(Large Pool):强烈建议为并行执行配置 Large Pool。这可以避免繁重的 IPC 内存分配与共享池中的 SQL 语句、PL/SQL 代码等争用内存,从而提升性能和稳定性。
- 并行度(DOP):一个并行操作实际使用的进程数由 DOP 决定。系统总的并行进程需求是所有并发并行操作 DOP 的总和。
- 队列(Queuing):当系统负载很高,请求的并行进程总数超过
PARALLEL_MAX_SERVERS时,如果启用了PARALLEL_DEGREE_POLICY = AUTO,新的并行语句会进入队列等待,而不是立即失败。这与V$PQ_SYSSTAT视图密切相关。
7. 常用查询 SQL
-
查看关键并行系统统计信息(最常用)
此查询过滤出最关键的几个指标,一目了然。SELECT statistic, value FROM v$px_process_sysstat WHERE statistic IN ('Servers Busy', 'Servers Idle', 'Servers Started', 'Servers Shutdown', 'Servers Highwater') ORDER BY statistic; -
监控并行进程利用率(RAC 环境)
在 RAC 中,需要从全局视图GV$查询,并按实例分组。SELECT inst_id, statistic, value FROM gv$px_process_sysstat WHERE statistic IN ('Servers Busy', 'Servers Idle', 'Servers Highwater') ORDER BY inst_id, statistic; -
检查并行内存分配情况
用于评估大型池(Large Pool)的使用情况。SELECT statistic, value FROM v$px_process_sysstat WHERE statistic LIKE 'Memory Chunks%' OR statistic LIKE 'Buffers%' ORDER BY statistic; -
计算动态视图与参数配置的差异
这个查询将实时统计信息与参数设置进行对比,非常具有指导意义。SELECT 'Current Busy' AS Metric, (SELECT value FROM v$px_process_sysstat WHERE statistic = 'Servers Busy') AS Value FROM dual UNION ALL SELECT 'Current Idle' AS Metric, (SELECT value FROM v$px_process_sysstat WHERE statistic = 'Servers Idle') AS Value FROM dual UNION ALL SELECT 'Current Total' AS Metric, (SELECT SUM(value) FROM v$px_process_sysstat WHERE statistic IN ('Servers Busy', 'Servers Idle')) AS Value FROM dual UNION ALL SELECT 'Historical HWM' AS Metric, (SELECT value FROM v$px_process_sysstat WHERE statistic = 'Servers Highwater') AS Value FROM dual UNION ALL SELECT 'PARALLEL_MAX_SERVERS' AS Metric, TO_CHAR(value) FROM v$parameter WHERE name = 'parallel_max_servers';
希望以上详尽的解释能帮助您完全理解 V$PX_PROCESS_SYSSTAT 视图,并有效地将其用于数据库性能监控和优化工作中。
欢迎关注我的公众号《IT小Chen》
321

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



