
好的,我们来深入、详细地探讨 Oracle 19C 数据库中的 V$SQLPA_METRIC 动态性能视图。这是一个用于分析和诊断 SQL 并行执行性能的核心视图。
🚀 Oracle 19C V$SQLPA_METRIC 动态性能视图详解
1. 概述与核心作用
V$SQLPA_METRIC 视图提供了关于 SQL 并行执行的详细运行时度量和统计信息。当一条 SQL 语句被并行执行时(通常通过 PARALLEL 提示或对象上的并行度设置触发),Oracle 会创建一组并行服务器进程(Parallel Execution Servers, PX)来协同工作。
- 核心作用:此视图用于监控、诊断和优化并行查询的性能。它揭示了并行执行计划中每个操作(如 PX SEND、PX RECEIVE、扫描、连接等)在每个并行服务器进程上的执行情况。
- 数据来源:视图中的数据在并行执行期间由各个并行服务器进程和查询协调器(Query Coordinator, QC)动态收集和填充。它提供了比常规的
V$SQL或执行计划更细粒度的性能洞察。
2. 主要使用场景
- 诊断并行执行性能瓶颈:识别并行执行计划中哪个步骤是最耗时的,或者是否存在数据倾斜(某些并行服务器进程处理的数据远多于其他进程)。
- 验证并行度(DOP)的有效性:检查实际使用的并行度是否与请求的并行度一致,以及资源是否被充分利用。
- 分析数据流与分布:通过
TQ_ID(Table Queue ID)跟踪数据在生产者和消费者并行服务器进程之间的流动情况。 - 优化并行执行参数:为设置
PARALLEL_THREADS_PER_CPU,PARALLEL_MIN_SERVERS等参数提供事实依据。 - 比较执行计划的改变:在SQL调优前后,对比并行执行度量指标的变化,以验证优化的效果。
3. 字段详解
下表详细列出了 V$SQLPA_METRIC 视图中的关键字段。请注意,字段名称和可用性可能因 Oracle 版本而异(19C 中非常丰富)。
| 字段名 (Column Name) | 数据类型 (Data Type) | 含义说明 (Description) | 备注与重要性 |
|---|---|---|---|
| QC_INSTANCE_ID | NUMBER | 查询协调器(QC)所在的实例ID。 | 在 RAC 环境中尤为重要,标识了哪个实例的QC在控制此并行执行。 |
| QC_SESSION_ID | NUMBER | 查询协调器(QC)的会话标识符(SID)。 | 可用于连接到 V$SESSION 视图获取QC会话的更多信息。 |
| SID | NUMBER | 产生该条记录的并行服务器进程的会话标识符(SID)。 | 关键字段。用于连接到 V$SESSION 查看PX进程的详细信息。 |
| SERVER_GROUP | NUMBER | 并行服务器组标识符。 | 用于区分同一并行语句中的不同服务器组。 |
| SERVER_SET | NUMBER | 并行服务器组内的服务器集合标识符。 | 内部组织标识。 |
| DOP | NUMBER | 此并行服务器进程所属并行执行的实际并行度(Degree of Parallelism)。 | 关键指标,用于验证实际执行的并行度。 |
| SQL_ID | VARCHAR2(13) | 正在被并行执行的 SQL 语句的 SQL_ID。 | 关键字段。用于连接到 V$SQL, DBA_HIST_SQLSTAT 等视图。 |
| SQL_EXEC_ID | NUMBER | SQL 执行标识符。与 SQL_ID 一起唯一标识一次具体的执行。 | 用于区分同一SQL语句的不同执行。 |
| SQL_EXEC_START | DATE | 该次 SQL 执行开始的时间。 | 用于定位特定的执行时间窗口。 |
| PX_PROCESS | VARCHAR2(30) | 并行服务器进程的系统操作系统进程ID。 | 格式通常为 'p' 或 's'。 |
| TQ_ID | NUMBER | 表队列(Table Queue)标识符。表队列是并行服务器进程之间通信的通道。 | 核心中的核心。用于跟踪数据在并行操作(如SEND/RECEIVE)间的流动。 |
| DFO_NUMBER | NUMBER | 数据流操作(Data Flow Operation)编号。一个复杂的并行执行可能被分解为多个DFO。 | 用于标识执行计划中独立的数据流单元。 |
| IO_INTER_CONNECT_BYTES | NUMBER | 通过互连网络传输的字节数(在RAC中,即实例间传输)。 | RAC性能诊断关键,值过高可能意味着跨实例并行效率低下。 |
| ESTIMATED_OPTIMAL_DOP | NUMBER | 系统根据当前工作负载和系统资源估算的最佳并行度。 | 与 DOP 对比,可判断当前设置的并行度是否合理。 |
| ESTIMATED_OPTIMAL_SIZE | NUMBER | 系统估算的与此 ESTIMATED_OPTIMAL_DOP 对应的最佳工作单元大小。 | |
| PHYSICAL_READ_REQUESTS | NUMBER | 物理读请求的次数。 | I/O 相关的性能指标。 |
| PHYSICAL_READ_BYTES | NUMBER | 物理读取的总字节数。 | I/O 相关的性能指标。 |
| PHYSICAL_WRITE_REQUESTS | NUMBER | 物理写请求的次数。 | I/O 相关的性能指标。 |
| PHYSICAL_WRITE_BYTES | NUMBER | 物理写入的总字节数。 | I/O 相关的性能指标。 |
| WORKAREA_MEM | NUMBER | 该进程用于工作区(如排序、哈希连接)的内存大小(字节)。 | PGA 内存使用情况。 |
| WORKAREA_MAX_MEM | NUMBER | 该进程工作区可使用的最大内存大小(字节)。 | PGA 内存使用情况。 |
| BUFFERS_QUEUED | NUMBER | 在表队列中排队等待处理的缓冲区数量。 | 队列竞争指标。如果值很高,表明消费者进程较慢,可能存在倾斜或瓶颈。 |
| BUFFERS_PROCESSED | NUMBER | 该进程已处理的缓冲区数量。 | 处理量的度量。 |
| BYTES_PROCESSED | NUMBER | 该进程已处理的总字节数。 | 关键指标。用于识别数据倾斜。比较不同PX进程的此值,若差异巨大,则存在倾斜。 |
| CPU_TIME | NUMBER | 该进程使用的CPU时间(微秒)。 | 资源消耗指标。 |
| ELAPSED_TIME | NUMBER | 该进程从开始到结束的总耗时(微秒)。 | 关键性能指标。 |
| IDLE_TIME | NUMBER | 该进程空闲等待的时间(微秒)。 | 等待事件指标。 |
| WAIT_COUNT | NUMBER | 等待事件发生的次数。 | 等待事件指标。 |
| QUEUING_TIME | NUMBER | 在表队列中等待获取数据的时间(微秒)。 | 队列竞争指标。时间长表示生产者慢或网络慢。 |
| VECTOR_PROCESSED | NUMBER | (如果适用)处理的向量化操作单元的数量。 | 与In-Memory选项相关。 |
4. 相关视图与基表
GV$SQLPA_METRIC:V$SQLPA_METRIC的全局版本,在 Oracle RAC 环境中显示所有实例上的并行执行度量信息。V$PQ_TQSTAT:极其重要的相关视图。它提供关于表队列(Table Queue)的详细统计信息,是诊断并行执行数据流动和倾斜的首选工具。它通常通过SELECT /*+ PARALLEL */ ...查询后,在同一个会话中立即查询V$PQ_TQSTAT来查看上一次并行执行的队列统计。V$SQL_MONITOR:监控近实时SQL执行(包括并行执行)的核心视图。它提供高级别的执行摘要,而V$SQLPA_METRIC提供更细粒度的进程级细节。两者通过SQL_ID和SQL_EXEC_ID关联。V$SESSION:通过SID字段关联,可以获取执行并行操作的服务器进程的会话状态、等待事件等详细信息。V$PX_PROCESS/V$PX_SESSION:用于查看当前活动的并行服务器进程和会话的信息。- 基表 (X$ Tables):如同所有
V$视图,V$SQLPA_METRIC基于一个或多个未公开的X$表(如X$SQLPA_METRIC)。这些表是Oracle内核中存储原始并行执行统计信息的内存结构的外部化体现。
5. 底层原理与内部机制
-
并行执行架构:
- 当一条SQL被并行执行时,查询协调器(QC)会话会负责规划和控制。
- QC会从并行服务器进程池中分配一组
p(生产者)和s(消费者)进程。 - 执行计划被分解为多个并行操作(如
PX BLOCK ITERATOR,PX SEND,PX RECEIVE)。 - 数据通过表队列(TQ) 在生产者和消费者进程之间流动。
-
度量数据收集:
- 每个并行服务器进程在运行时都会收集其本地性能指标(如处理的行数、字节数、CPU时间、等待时间)。
- 这些指标被存储在进程私有内存中,最终会聚合并可通过
V$SQLPA_METRIC视图查询。 - 收集是近乎实时的,但随着执行的进行,视图中的数据会不断更新。
-
数据可见性与生命周期:
V$SQLPA_METRIC中的数据在并行执行期间和完成后短暂的一段时间内可见。- 其生命周期与共享池中游标的内存结构生命周期相关联。一旦游标被老化出共享池,或者实例重启,这些详细的度量数据就会丢失。
- 对于历史分析,需要依赖
DBA_HIST_*数据字典视图(如DBA_HIST_SQL_MONITOR),但这些视图通常包含的是从V$SQL_MONITOR聚合来的摘要信息,而非V$SQLPA_METRIC的进程级细节。
6. 常用查询 SQL
查询1:查看当前正在进行的并行操作
此查询帮助您识别当前正在系统上运行的并行查询。
SELECT sid, sql_id, sql_exec_start, dop, qc_instance_id, qc_session_id
FROM v$sqlpa_metric
WHERE elapsed_time IS NULL; -- 如果ELAPSED_TIME为空,说明可能还在执行
查询2:分析特定SQL执行的并行性能和数据倾斜
这是最常用的诊断查询,用于识别数据倾斜和性能瓶颈。替换 &sql_id 和 &exec_id。
SELECT
dfo_number,
tq_id,
server_type,
process_name,
num_rows,
-- 计算倾斜率:最大处理行数 / 平均处理行数。比率越高,倾斜越严重。
ROUND(MAX(num_rows) OVER (PARTITION BY dfo_number, tq_id) /
(AVG(num_rows) OVER (PARTITION BY dfo_number, tq_id)), 2) AS skew_ratio,
cpu_time,
elapsed_time,
bytes_processed,
io_inter_connect_bytes
FROM
(SELECT
dfo_number,
tq_id,
CASE WHEN server_type = 'Producer' THEN 'P' ELSE 'C' END AS server_type,
px_process AS process_name,
ROUND(bytes_processed / 1024 / 1024, 2) AS mb_processed,
buffers_processed AS num_rows, -- 近似代表行数
cpu_time / 1000000 AS cpu_time_sec,
elapsed_time / 1000000 AS elapsed_time_sec,
cpu_time,
elapsed_time,
bytes_processed,
io_inter_connect_bytes
FROM v$sqlpa_metric
WHERE sql_id = '&sql_id'
AND sql_exec_id = &sql_exec_id
)
ORDER BY dfo_number, tq_id, server_type DESC, process_name;
查询3:按DFO和TQ聚合,查看整体数据流情况
SELECT
sql_id,
dfo_number,
tq_id,
MIN(elapsed_time)/1000000 AS min_etime_sec,
MAX(elapsed_time)/1000000 AS max_etime_sec,
AVG(elapsed_time)/1000000 AS avg_etime_sec,
SUM(bytes_processed)/1024/1024 AS total_mb_processed,
SUM(io_inter_connect_bytes)/1024/1024 AS total_interconnect_mb
FROM v$sqlpa_metric
WHERE sql_id = '&sql_id'
GROUP BY sql_id, dfo_number, tq_id
ORDER BY dfo_number, tq_id;
查询4:结合 V$SESSION 查看等待事件
诊断并行进程在等待什么。
SELECT
m.sid,
m.px_process,
s.event,
s.wait_time,
s.seconds_in_wait,
m.bytes_processed
FROM v$sqlpa_metric m
JOIN v$session s ON m.sid = s.sid
WHERE m.sql_id = '&sql_id'
AND m.sql_exec_id = &sql_exec_id;
7. 知识点与注意事项
- 权限要求:查询
V$SQLPA_METRIC通常需要SELECT ANY DICTIONARY权限或直接被授予SELECT ON V_$SQLPA_METRIC权限。 - 数据时效性:视图中的数据是临时性的。它不会永久保留。对于长期性能监控,应使用 Oracle Diagnostic Pack 工具(如 Automatic Workload Repository - AWR),其中的
DBA_HIST_SQL_MONITOR视图会保存并行执行的摘要信息。 - 诊断流程:
- 从
V$SQL_MONITOR找到性能不佳的 SQL (SQL_ID,SQL_EXEC_ID)。 - 使用
SQL_ID和SQL_EXEC_ID深入到V$SQLPA_METRIC进行细粒度分析。 - 重点关注:
BYTES_PROCESSED(数据倾斜)、ELAPSED_TIME(步骤耗时)、TQ_ID(数据流)、IO_INTER_CONNECT_BYTES(RAC网络流量)。
- 从
- 数据倾斜:如果不同并行进程的
BYTES_PROCESSED或BUFFERS_PROCESSED差异巨大,表明存在数据倾斜,这通常是并行执行性能问题的主要根源。解决方法可能包括使用更好的分区键、 hints(如PARALLEL和NO_PARALLEL)来控制分布,或者重新评估连接条件。
通过综合运用 V$SQLPA_METRIC 和相关的动态性能视图,您可以深入洞察并行 SQL 执行的内部运作机制,从而有效地进行性能调优和故障排除。
欢迎关注我的公众号《IT小Chen》

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



