计算节点范围选择与并行度控制

本文介绍了弹性跨机并行查询(ePQ)如何进行计算节点范围选择以及并行度控制。

前提条件

支持的PolarDB PostgreSQL版的版本如下:

  • PostgreSQL 11(内核小版本1.1.20及以上)

  • PostgreSQL 14(内核小版本14.6.6.0及以上)

说明

您可通过如下语句查看PolarDB PostgreSQL版的内核小版本的版本号:

  • PostgreSQL 11

    show polar_version;
  • PostgreSQL 14

    select version();

简介

PolarDB PostgreSQL版的弹性跨机并行查询(ePQ)特性提供了精细的粒度控制方法,可以合理使用集群内的计算资源。在最大程度利用闲置计算资源进行并行查询,提升资源利用率的同时,避免了对其它业务负载产生影响:

  • ePQ可以动态调整集群中参与并行查询的计算节点范围,避免使用负载较高的计算节点。

  • ePQ支持为每条查询动态调整在计算节点上的并行度,避免ePQ并行查询进程对计算资源的消耗影响到相同节点上的其他进程。

计算节点范围选择

参数说明

参数

说明

polar_px_nodes

用于指定参与ePQ的计算节点范围,默认值为空,表示所有只读节点都参与ePQ并行查询。

说明
  • 通过以下命令,查看参与ePQ的计算节点范围。

    SHOW polar_px_nodes;
  • 如果部分只读节点负载较高,则可以通过修改polar_px_nodes参数设置仅特定几个只读节点参与ePQ并行查询。

  • polar_px_nodes参数的合法格式是一个以英文逗号分隔的节点名称列表。

polar_px_use_primary

用于设置读写节点是否参与ePQ并行查询,取值如下:

  • ON:读写节点参与ePQ并行查询。

  • OFF:读写节点不参与ePQ并行查询。

说明
  • 该参数适用于PostgreSQL 14。

  • 执行以下命令,设置读写节点参与ePQ并行查询。

    SET polar_px_use_primary TO ON;

polar_px_use_master

用于设置读写节点是否参与ePQ并行查询,取值如下:

  • ON:读写节点参与ePQ并行查询。

  • OFF:读写节点不参与ePQ并行查询

说明
  • 该参数适用于PostgreSQL 11。

  • 执行以下命令,设置读写节点参与ePQ并行查询。

    SET polar_px_use_master TO ON;

示例

  1. 安装polar_monitor插件,用于获取节点名称。

    CREATE EXTENSION IF NOT EXISTS polar_monitor;
  2. 通过polar_monitor插件提供的集群拓扑视图,查询集群中所有计算节点名称。

    SELECT name,slot_name,type FROM polar_cluster_info;

    查询结果如下:

     name  | slot_name |  type
    -------+-----------+---------
     node0 |           | Primary
     node1 | standby1  | Standby
     node2 | replica1  | Replica
     node3 | replica2  | Replica
    (4 rows)
    说明

    其中:

    • Primary:表示读写节点。

    • Replica:表示只读节点。

    • Standby:表示备库节点。

  3. 使用负载较低的只读节点node2node3参与ePQ并行查询。

    SET polar_px_nodes = 'node2,node3';
    SHOW polar_px_nodes;

    结果显示如下:

     polar_px_nodes
    ----------------
     node2,node3
    (1 row)

并行度控制

参数说明

参数

说明

polar_px_dop_per_node

用于设置当前会话中的ePQ查询在每个计算节点上的执行单元(Segment)数量,每个执行单元会为其需要执行的每一个计划分片(Slice)启动一个进程。默认值为3,通用最佳实践值为当前计算节点CPU核心数的一半。

说明
  • 如果计算节点的CPU负载较高时,可以酌情递减该参数,控制计算节点的CPU占用率至80%以下。

  • 如果查询性能不佳时,可以酌情递增该参数,也需要保持计算节点的CPU占用率不高于 80%。否则可能会拖慢其他的后台进程。

示例

  1. 创建一张表。

    CREATE TABLE test(id INT);
  2. 假设集群内有两个只读节点,polar_px_nodes参数为空,此时ePQ将使用集群内的所有只读节点参与并行查询。polar_px_dop_per_node参数的值为3,表示每个计算节点上将会有三个执行单元。执行计划如下。

    SHOW polar_px_nodes;
     polar_px_nodes
    ----------------
    
    (1 row)
    
    SHOW polar_px_dop_per_node;
     polar_px_dop_per_node
    -----------------------
     3
    (1 row)
    
    EXPLAIN SELECT * FROM test;
                                      QUERY PLAN
    -------------------------------------------------------------------------------
     PX Coordinator 6:1  (slice1; segments: 6)  (cost=0.00..431.00 rows=1 width=4)
       ->  Partial Seq Scan on test  (cost=0.00..431.00 rows=1 width=4)
     Optimizer: PolarDB PX Optimizer
    (3 rows)

    从执行计划中可以看出,两个只读节点上总计有六个执行单元(segments: 6)将会执行这个计划中唯一的计划分片slice1,表示总计会有六个进程并行执行当前查询。

  3. polar_px_dop_per_node参数调整为4,再次执行查询,两个只读节点上总计会有八个执行单元参与当前查询。由于执行计划中只有一个计划分片slice1,则表示总计会有八个进程并行执行当前查询。

    SET polar_px_dop_per_node TO 4;
    
    EXPLAIN SELECT * FROM test;
                                      QUERY PLAN
    -------------------------------------------------------------------------------
     PX Coordinator 8:1  (slice1; segments: 8)  (cost=0.00..431.00 rows=1 width=4)
       ->  Partial Seq Scan on test  (cost=0.00..431.00 rows=1 width=4)
     Optimizer: PolarDB PX Optimizer
    (3 rows)
  4. 设置polar_px_use_primary参数,让读写节点也参与查询,则读写节点上也将会有四个执行单元参与ePQ并行执行,集群内总计12个进程参与并行执行。

    SET polar_px_use_primary TO ON;
    
    EXPLAIN SELECT * FROM test;
                                       QUERY PLAN
    ---------------------------------------------------------------------------------
     PX Coordinator 12:1  (slice1; segments: 12)  (cost=0.00..431.00 rows=1 width=4)
       ->  Partial Seq Scan on test  (cost=0.00..431.00 rows=1 width=4)
     Optimizer: PolarDB PX Optimizer
    (3 rows)