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

在这里插入图片描述
好的,我们来深入、详细地探讨 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. 主要使用场景

  1. 诊断并行执行性能瓶颈:识别并行执行计划中哪个步骤是最耗时的,或者是否存在数据倾斜(某些并行服务器进程处理的数据远多于其他进程)。
  2. 验证并行度(DOP)的有效性:检查实际使用的并行度是否与请求的并行度一致,以及资源是否被充分利用。
  3. 分析数据流与分布:通过 TQ_ID(Table Queue ID)跟踪数据在生产者和消费者并行服务器进程之间的流动情况。
  4. 优化并行执行参数:为设置 PARALLEL_THREADS_PER_CPU, PARALLEL_MIN_SERVERS 等参数提供事实依据。
  5. 比较执行计划的改变:在SQL调优前后,对比并行执行度量指标的变化,以验证优化的效果。

3. 字段详解

下表详细列出了 V$SQLPA_METRIC 视图中的关键字段。请注意,字段名称和可用性可能因 Oracle 版本而异(19C 中非常丰富)

字段名 (Column Name)数据类型 (Data Type)含义说明 (Description)备注与重要性
QC_INSTANCE_IDNUMBER查询协调器(QC)所在的实例ID在 RAC 环境中尤为重要,标识了哪个实例的QC在控制此并行执行。
QC_SESSION_IDNUMBER查询协调器(QC)的会话标识符(SID)可用于连接到 V$SESSION 视图获取QC会话的更多信息。
SIDNUMBER产生该条记录的并行服务器进程的会话标识符(SID)关键字段。用于连接到 V$SESSION 查看PX进程的详细信息。
SERVER_GROUPNUMBER并行服务器组标识符。用于区分同一并行语句中的不同服务器组。
SERVER_SETNUMBER并行服务器组内的服务器集合标识符。内部组织标识。
DOPNUMBER此并行服务器进程所属并行执行的实际并行度(Degree of Parallelism)关键指标,用于验证实际执行的并行度。
SQL_IDVARCHAR2(13)正在被并行执行的 SQL 语句的 SQL_ID关键字段。用于连接到 V$SQL, DBA_HIST_SQLSTAT 等视图。
SQL_EXEC_IDNUMBERSQL 执行标识符。与 SQL_ID 一起唯一标识一次具体的执行。用于区分同一SQL语句的不同执行。
SQL_EXEC_STARTDATE该次 SQL 执行开始的时间用于定位特定的执行时间窗口。
PX_PROCESSVARCHAR2(30)并行服务器进程的系统操作系统进程ID格式通常为 'p''s'
TQ_IDNUMBER表队列(Table Queue)标识符。表队列是并行服务器进程之间通信的通道。核心中的核心。用于跟踪数据在并行操作(如SEND/RECEIVE)间的流动。
DFO_NUMBERNUMBER数据流操作(Data Flow Operation)编号。一个复杂的并行执行可能被分解为多个DFO。用于标识执行计划中独立的数据流单元。
IO_INTER_CONNECT_BYTESNUMBER通过互连网络传输的字节数(在RAC中,即实例间传输)。RAC性能诊断关键,值过高可能意味着跨实例并行效率低下。
ESTIMATED_OPTIMAL_DOPNUMBER系统根据当前工作负载和系统资源估算的最佳并行度DOP 对比,可判断当前设置的并行度是否合理。
ESTIMATED_OPTIMAL_SIZENUMBER系统估算的与此 ESTIMATED_OPTIMAL_DOP 对应的最佳工作单元大小。
PHYSICAL_READ_REQUESTSNUMBER物理读请求的次数。I/O 相关的性能指标。
PHYSICAL_READ_BYTESNUMBER物理读取的总字节数。I/O 相关的性能指标。
PHYSICAL_WRITE_REQUESTSNUMBER物理写请求的次数。I/O 相关的性能指标。
PHYSICAL_WRITE_BYTESNUMBER物理写入的总字节数。I/O 相关的性能指标。
WORKAREA_MEMNUMBER该进程用于工作区(如排序、哈希连接)的内存大小(字节)。PGA 内存使用情况。
WORKAREA_MAX_MEMNUMBER该进程工作区可使用的最大内存大小(字节)。PGA 内存使用情况。
BUFFERS_QUEUEDNUMBER在表队列中排队等待处理的缓冲区数量。队列竞争指标。如果值很高,表明消费者进程较慢,可能存在倾斜或瓶颈。
BUFFERS_PROCESSEDNUMBER该进程已处理的缓冲区数量。处理量的度量。
BYTES_PROCESSEDNUMBER该进程已处理的总字节数。关键指标。用于识别数据倾斜。比较不同PX进程的此值,若差异巨大,则存在倾斜。
CPU_TIMENUMBER该进程使用的CPU时间(微秒)。资源消耗指标。
ELAPSED_TIMENUMBER该进程从开始到结束的总耗时(微秒)。关键性能指标
IDLE_TIMENUMBER该进程空闲等待的时间(微秒)。等待事件指标。
WAIT_COUNTNUMBER等待事件发生的次数。等待事件指标。
QUEUING_TIMENUMBER在表队列中等待获取数据的时间(微秒)。队列竞争指标。时间长表示生产者慢或网络慢。
VECTOR_PROCESSEDNUMBER(如果适用)处理的向量化操作单元的数量。与In-Memory选项相关。

4. 相关视图与基表

  1. GV$SQLPA_METRICV$SQLPA_METRIC 的全局版本,在 Oracle RAC 环境中显示所有实例上的并行执行度量信息。
  2. V$PQ_TQSTAT极其重要的相关视图。它提供关于表队列(Table Queue)的详细统计信息,是诊断并行执行数据流动和倾斜的首选工具。它通常通过 SELECT /*+ PARALLEL */ ... 查询后,在同一个会话中立即查询 V$PQ_TQSTAT 来查看上一次并行执行的队列统计。
  3. V$SQL_MONITOR:监控近实时SQL执行(包括并行执行)的核心视图。它提供高级别的执行摘要,而 V$SQLPA_METRIC 提供更细粒度的进程级细节。两者通过 SQL_IDSQL_EXEC_ID 关联。
  4. V$SESSION:通过 SID 字段关联,可以获取执行并行操作的服务器进程的会话状态、等待事件等详细信息。
  5. V$PX_PROCESS / V$PX_SESSION:用于查看当前活动的并行服务器进程和会话的信息。
  6. 基表 (X$ Tables):如同所有 V$ 视图,V$SQLPA_METRIC 基于一个或多个未公开的 X$ 表(如 X$SQLPA_METRIC)。这些表是Oracle内核中存储原始并行执行统计信息的内存结构的外部化体现。

5. 底层原理与内部机制

  1. 并行执行架构

    • 当一条SQL被并行执行时,查询协调器(QC)会话会负责规划和控制。
    • QC会从并行服务器进程池中分配一组p(生产者)和s(消费者)进程。
    • 执行计划被分解为多个并行操作(如 PX BLOCK ITERATOR, PX SEND, PX RECEIVE)。
    • 数据通过表队列(TQ) 在生产者和消费者进程之间流动。
  2. 度量数据收集

    • 每个并行服务器进程在运行时都会收集其本地性能指标(如处理的行数、字节数、CPU时间、等待时间)。
    • 这些指标被存储在进程私有内存中,最终会聚合并可通过 V$SQLPA_METRIC 视图查询。
    • 收集是近乎实时的,但随着执行的进行,视图中的数据会不断更新。
  3. 数据可见性与生命周期

    • 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. 知识点与注意事项

  1. 权限要求:查询 V$SQLPA_METRIC 通常需要 SELECT ANY DICTIONARY 权限或直接被授予 SELECT ON V_$SQLPA_METRIC 权限。
  2. 数据时效性:视图中的数据是临时性的。它不会永久保留。对于长期性能监控,应使用 Oracle Diagnostic Pack 工具(如 Automatic Workload Repository - AWR),其中的 DBA_HIST_SQL_MONITOR 视图会保存并行执行的摘要信息。
  3. 诊断流程
    • V$SQL_MONITOR 找到性能不佳的 SQL (SQL_ID, SQL_EXEC_ID)。
    • 使用 SQL_IDSQL_EXEC_ID 深入到 V$SQLPA_METRIC 进行细粒度分析。
    • 重点关注:BYTES_PROCESSED(数据倾斜)、ELAPSED_TIME(步骤耗时)、TQ_ID(数据流)、IO_INTER_CONNECT_BYTES(RAC网络流量)。
  4. 数据倾斜:如果不同并行进程的 BYTES_PROCESSEDBUFFERS_PROCESSED 差异巨大,表明存在数据倾斜,这通常是并行执行性能问题的主要根源。解决方法可能包括使用更好的分区键、 hints(如 PARALLELNO_PARALLEL)来控制分布,或者重新评估连接条件。

通过综合运用 V$SQLPA_METRIC 和相关的动态性能视图,您可以深入洞察并行 SQL 执行的内部运作机制,从而有效地进行性能调优和故障排除。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值