PolarDB PostgreSQL引擎支持使用跨机并行查询功能进行分析型查询,实现一定的HTAP能力。本文介绍如何使用跨机并行查询,提升分析型查询的性能。

原理介绍

当一条查询请求在查询协调节点上被执行跨机并行查询时,该查询产生的执行计划会被分片路由至各个执行节点,每个执行节点将会执行各自的分片计划,并将分片的查询结果汇总至查询协调节点。可以称查询协调节点为QC(Query Coordinator)节点,称分片计划的执行节点为PX(Parallel Execution)节点。

跨机并行查询原理

如上图所示,RO1为QC节点,它接收了一条查询输入请求,并将查询计划分片路由至RO2、RO3、RO4三个PX节点。每个PX节点将会针对各自接收到的分片计划,最终从PolarFS共享存储上读取到各自所需的数据块,由执行节点执行完成相应的分片计划,并将执行结果返回为QC节点,QC节点汇总后返回查询结果。

注意事项

由于跨机并行查询功能需使用多个只读节点资源,因此只适用于低频次的分析型查询。

参数说明

默认情况下,PolarDB PostgreSQL引擎不开启跨机并行查询功能。若您需要使用此功能,请使用如下参数:

参数 说明
polar_cluster_map 用于查询当前PolarDB PostgreSQL引擎所有只读节点的名称。该参数不可配置。当您新增一个只读节点时,该参数会进行更新。
polar_px_nodes 指定参与跨机并行查询的只读节点。默认为空,表示所有只读节点都参与。可配置为指定节点参与跨机并行查询,以逗号分隔。例如:
SHOW polar_px_nodes ;
 polar_px_nodes
----------------

(1 row)
SET polar_px_nodes='node1,node2';
SHOW polar_px_nodes ;
 polar_px_nodes
----------------
 node1,node2
(1 row)
polar_px_enable_replay_wait PolarDB PostgreSQL引擎的主节点与只读节点存在一定程度的延迟,当主节点执行DDL语句(例如CREATE TABLE),只读节点需要耗时回放该DDL日志后才可见新创建的表。当设置polar_px_enable_replay_wait为on后,跨机并行查询启用强一致性,当前发起的跨机并行查询请求路由到只读节点上执行时,需要只读节点回放到该查询请求前最近的一条日志后,才会执行查询请求。

该参数默认为off,即关闭强一致性,在数据库主备日志延迟较高时,不保证只读节点可以读到最近的DDL记录。您可配置polar_px_enable_replay_wait为on,表示启用强一致性,但是跨机并行查询会损失一定程度的性能。

polar_px_max_workers_number 设置单个节点上的最大跨机并行查询workers进程数,默认为30。该参数限制了单个节点上的最大并发度,节点上所有会话的跨机并行查询workers进程数不能超过该参数大小。
polar_enable_px 指定是否开启跨机并行查询功能。默认为off,即不开启。
polar_px_dop_per_node 设置当前会话并行查询的并行度,默认为1,推荐值为当前CPU总核数。若设置该参数为N,则一个会话在每个节点上将会启用N个px workers进程,用于处理当前的跨机并行查询逻辑。
px_workers 指定跨机并行查询是否对特定表生效。默认不生效。跨机并行查询功能比较消耗计算节点集群资源,因此只有对设置了px_workers的表才使用该功能。例如:
--表示t1表允许跨机并行查询
ALTER TABLE t1 SET(px_workers=1);

--表示t1表禁止跨机并行查询
ALTER TABLE t1 SET(px_workers=-1);

--表示t1表忽略跨机并行查询, 默认状态
ALTER TABLE t1 SET(px_workers=0);

示例

本示例以简单的单表查询操作,来描述跨机并行查询的功能是否有效。

示例背景:

执行如下命令,创建test表并插入基础数据。

CREATE TABLE test(id int);
INSERT INTO test SELECT generate_series(1,1000000);
EXPLAIN SELECT * FROM test;

默认情况下跨机并行查询功能是不开启的,单表查询执行计划为原生的Seq Scan,结果如下所示。

                       QUERY PLAN
--------------------------------------------------------
 Seq Scan on test  (cost=0.00..35.50 rows=2550 width=4)
(1 row)

通过以下步骤,开启并使用跨机并行查询功能:

  1. 对test表启用跨机并行查询功能。
    ALTER TABLE test SET (px_workers=1);
    SET polar_enable_px=on;
    EXPLAIN SELECT * FROM test;

    查询结果如下:

                                      QUERY PLAN
    -------------------------------------------------------------------------------
     PX Coordinator 2:1  (slice1; segments: 2)  (cost=0.00..431.00 rows=1 width=4)
       ->  Seq Scan on test (scan partial)  (cost=0.00..431.00 rows=1 width=4)
     Optimizer: PolarDB PX Optimizer
    (3 rows)
  2. 查询当前所有只读节点的名称。

    查询命令如下:

    SHOW polar_cluster_map;

    查询结果如下:

     polar_cluster_map
    -------------------
     node1,node2,node3
    (1 row)

    可得出当前集群有3个只读节点,名称分别为:node1,node2和node3。

  3. 指定node1和node2只读节点参与跨机并行查询。

    命令如下:

    SET polar_px_nodes='node1,node2';

    查询参与并行查询的节点:

    SHOW polar_px_nodes ;

    查询结果如下:

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

性能数据

在5个只读节点的情况下,测试的性能数据如下:

  • SELECT COUNT(*)扫表的场景下,跨机并行查询比单机并行查询加速60倍。
  • 在TPC-H场景下,跨机并行查询比单机并行查询加速30倍。
    说明 此处的TPC-H场景是基于TPC-H的基准测试,并不能与已发布的TPC-H基准测试结果相比较,此处提及的测试结果并不符合TPC-H基准测试的所有要求。