本文介绍了弹性跨机并行查询(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并行查询。 说明
|
polar_px_use_primary | 用于设置读写节点是否参与ePQ并行查询,取值如下:
说明
|
polar_px_use_master | 用于设置读写节点是否参与ePQ并行查询,取值如下:
说明
|
示例
安装
polar_monitor
插件,用于获取节点名称。CREATE EXTENSION IF NOT EXISTS polar_monitor;
通过
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
:表示备库节点。
使用负载较低的只读节点
node2
和node3
参与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核心数的一半。 说明
|
示例
创建一张表。
CREATE TABLE test(id INT);
假设集群内有两个只读节点,
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
,表示总计会有六个进程并行执行当前查询。将
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)
设置
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)