暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PolarDB-PG原理解读 ——HTAP 架构详解(六)

PolarDB农夫山泉 2023-07-25
82

PolarDB PostgreSQL版(以下简称 PolarDB-PG)是一款阿里云自主研发的企业级数据库产品,采用计算存储分离架构,兼容 PostgreSQL 与 Oracle。PolarDB-PG 的存储与计算能力均可横向扩展,具有高可靠、高可用、弹性扩展等企业级数据库特性。同时,PolarDB-PG 具有大规模并行计算能力,可以应对 OLTP 与 OLAP 混合负载;还具有时空、向量、搜索、图谱等多模创新特性,可以满足企业对数据处理日新月异的新需求。

使用说明

PolarDB-PG HTAP 适用于日常业务中的 轻分析类业务,例如:对账业务,报表业务。

使用 MPP 进行分析型查询

PolarDB-PG 引擎默认不开启 MPP 功能。若您需要使用此功能,请使用如下参数:

  • polar_enable_px:指定是否开启 MPP 功能。默认为 OFF,即不开启。
  • polar_px_max_workers_number:设置单个节点上的最大 MPP Worker 进程数,默认为 30。该参数限制了单个节点上的最大并行度,节点上所有会话的 MPP workers 进程数不能超过该参数大小。
  • polar_px_dop_per_node:设置当前会话并行查询的并行度,默认为 1,推荐值为当前 CPU 总核数。若设置该参数为 N,则一个会话在每个节点上将会启用 N 个 MPP Worker 进程,用于处理当前的 MPP 逻辑
  • polar_px_nodes:指定参与 MPP 的只读节点。默认为空,表示所有只读节点都参与。可配置为指定节点参与 MPP,以逗号分隔
  • px_worker:指定 MPP 是否对特定表生效。默认不生效。MPP 功能比较消耗集群计算节点的资源,因此只有对设置了 px_workers 的表才使用该功能。例如:
    • ALTER TABLE t1 SET(px_workers=1) 表示 t1 表允许 MPP
    • ALTER TABLE t1 SET(px_workers=-1) 表示 t1 表禁止 MPP
    • ALTER TABLE t1 SET(px_workers=0) 表示 t1 表忽略 MPP(默认状态)

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

-- 创建 test 表并插入基础数据。 CREATE TABLE test(id int); INSERT INTO test SELECT generate_series(1,1000000); -- 默认情况下 MPP 功能不开启,单表查询执行计划为 PG 原生的 Seq Scan EXPLAIN SELECT * FROM test; QUERY PLAN -------------------------------------------------------- Seq Scan on test (cost=0.00..35.50 rows=2550 width=4) (1 row)
复制

开启并使用 MPP 功能:

-- 对 test 表启用 MPP 功能 ALTER TABLE test SET (px_workers=1); -- 开启 MPP 功能 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)
复制

配置参与 MPP 的计算节点范围:

-- 查询当前所有只读节点的名称 CREATE EXTENSION polar_monitor; SELECT name,host,port FROM polar_cluster_info WHERE px_node='t'; name | host | port -------+-----------+------ node1 | 127.0.0.1 | 5433 node2 | 127.0.0.1 | 5434 (2 rows) -- 当前集群有 2 个只读节点,名称分别为:node1,node2 -- 指定 node1 只读节点参与 MPP SET polar_px_nodes = 'node1'; -- 查询参与并行查询的节点 SHOW polar_px_nodes; polar_px_nodes ---------------- node1 (1 row) EXPLAIN SELECT * FROM test; QUERY PLAN ------------------------------------------------------------------------------- PX Coordinator 1:1 (slice1; segments: 1) (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)
复制

使用 MPP 进行分区表查询

当前 MPP 对分区表支持的功能如下所示:

  • 支持 Range 分区的并行查询
  • 支持 List 分区的并行查询
  • 支持单列 Hash 分区的并行查询
  • 支持分区裁剪
  • 支持带有索引的分区表并行查询
  • 支持分区表连接查询
  • 支持多级分区的并行查询
--分区表 MPP 功能默认关闭,需要先开启 MPP 功能 SET polar_enable_px = ON; -- 执行以下语句,开启分区表 MPP 功能 SET polar_px_enable_partition = true; -- 执行以下语句,开启多级分区表 MPP 功能 SET polar_px_optimizer_multilevel_partitioning = true;
复制

使用 MPP 加速索引创建

当前仅支持对 B-Tree 索引的构建,且暂不支持 INCLUDE 等索引构建语法,暂不支持表达式等索引列类型。

如果需要使用 MPP 功能加速创建索引,请使用如下参数:

  • polar_px_dop_per_node:指定通过 MPP 加速构建索引的并行度。默认为 1
  • polar_px_enable_replay_wait:当使用 MPP 加速索引构建时,当前会话内无需手动开启该参数,该参数将自动生效,以保证最近更新的数据表项可以被创建到索引中,保证索引表的完整性。索引创建完成后,该参数将会被重置为数据库默认值。
  • polar_px_enable_btbuild:是否开启使用 MPP 加速创建索引。取值为 OFF 时不开启(默认),取值为 ON 时开启。
  • polar_bt_write_page_buffer_size:指定索引构建过程中的写 I/O 策略。该参数默认值为 0(不开启),单位为块,最大值可设置为 8192。推荐设置为 4096
    • 当该参数设置为不开启时,在索引创建的过程中,对于索引页写满后的写盘方式是 block-by-block 的单个块写盘。
    • 当该参数设置为开启时,内核中将缓存一个 polar_bt_write_page_buffer_size 大小的 buffer,对于需要写盘的索引页,会通过该 buffer 进行 I/O 合并再统一写盘,避免了频繁调度 I/O 带来的性能开销。该参数会额外提升 20% 的索引创建性能。
    • 使用说明

PolarDB-PG HTAP 适用于日常业务中的 轻分析类业务,例如:对账业务,报表业务。

使用 MPP 进行分析型查询

PolarDB-PG 引擎默认不开启 MPP 功能。若您需要使用此功能,请使用如下参数:

  • polar_enable_px:指定是否开启 MPP 功能。默认为 OFF,即不开启。
  • polar_px_max_workers_number:设置单个节点上的最大 MPP Worker 进程数,默认为 30。该参数限制了单个节点上的最大并行度,节点上所有会话的 MPP workers 进程数不能超过该参数大小。
  • polar_px_dop_per_node:设置当前会话并行查询的并行度,默认为 1,推荐值为当前 CPU 总核数。若设置该参数为 N,则一个会话在每个节点上将会启用 N 个 MPP Worker 进程,用于处理当前的 MPP 逻辑
  • polar_px_nodes:指定参与 MPP 的只读节点。默认为空,表示所有只读节点都参与。可配置为指定节点参与 MPP,以逗号分隔
  • px_worker:指定 MPP 是否对特定表生效。默认不生效。MPP 功能比较消耗集群计算节点的资源,因此只有对设置了 px_workers 的表才使用该功能。例如:
    • ALTER TABLE t1 SET(px_workers=1) 表示 t1 表允许 MPP
    • ALTER TABLE t1 SET(px_workers=-1) 表示 t1 表禁止 MPP
    • ALTER TABLE t1 SET(px_workers=0) 表示 t1 表忽略 MPP(默认状态)

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

-- 创建 test 表并插入基础数据。 CREATE TABLE test(id int); INSERT INTO test SELECT generate_series(1,1000000); -- 默认情况下 MPP 功能不开启,单表查询执行计划为 PG 原生的 Seq Scan EXPLAIN SELECT * FROM test; QUERY PLAN -------------------------------------------------------- Seq Scan on test (cost=0.00..35.50 rows=2550 width=4) (1 row)
复制

开启并使用 MPP 功能:

-- 对 test 表启用 MPP 功能 ALTER TABLE test SET (px_workers=1); -- 开启 MPP 功能 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)
复制

配置参与 MPP 的计算节点范围:

-- 查询当前所有只读节点的名称 CREATE EXTENSION polar_monitor; SELECT name,host,port FROM polar_cluster_info WHERE px_node='t'; name | host | port -------+-----------+------ node1 | 127.0.0.1 | 5433 node2 | 127.0.0.1 | 5434 (2 rows) -- 当前集群有 2 个只读节点,名称分别为:node1,node2 -- 指定 node1 只读节点参与 MPP SET polar_px_nodes = 'node1'; -- 查询参与并行查询的节点 SHOW polar_px_nodes; polar_px_nodes ---------------- node1 (1 row) EXPLAIN SELECT * FROM test; QUERY PLAN ------------------------------------------------------------------------------- PX Coordinator 1:1 (slice1; segments: 1) (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)
复制

使用 MPP 进行分区表查询

当前 MPP 对分区表支持的功能如下所示:

  • 支持 Range 分区的并行查询
  • 支持 List 分区的并行查询
  • 支持单列 Hash 分区的并行查询
  • 支持分区裁剪
  • 支持带有索引的分区表并行查询
  • 支持分区表连接查询
  • 支持多级分区的并行查询
--分区表 MPP 功能默认关闭,需要先开启 MPP 功能 SET polar_enable_px = ON; -- 执行以下语句,开启分区表 MPP 功能 SET polar_px_enable_partition = true; -- 执行以下语句,开启多级分区表 MPP 功能 SET polar_px_optimizer_multilevel_partitioning = true;
复制

使用 MPP 加速索引创建

当前仅支持对 B-Tree 索引的构建,且暂不支持 INCLUDE 等索引构建语法,暂不支持表达式等索引列类型。

如果需要使用 MPP 功能加速创建索引,请使用如下参数:

  • polar_px_dop_per_node:指定通过 MPP 加速构建索引的并行度。默认为 1
  • polar_px_enable_replay_wait:当使用 MPP 加速索引构建时,当前会话内无需手动开启该参数,该参数将自动生效,以保证最近更新的数据表项可以被创建到索引中,保证索引表的完整性。索引创建完成后,该参数将会被重置为数据库默认值。
  • polar_px_enable_btbuild:是否开启使用 MPP 加速创建索引。取值为 OFF 时不开启(默认),取值为 ON 时开启。
  • polar_bt_write_page_buffer_size:指定索引构建过程中的写 I/O 策略。该参数默认值为 0(不开启),单位为块,最大值可设置为 8192。推荐设置为 4096
    • 当该参数设置为不开启时,在索引创建的过程中,对于索引页写满后的写盘方式是 block-by-block 的单个块写盘。
    • 当该参数设置为开启时,内核中将缓存一个 polar_bt_write_page_buffer_size 大小的 buffer,对于需要写盘的索引页,会通过该 buffer 进行 I/O 合并再统一写盘,避免了频繁调度 I/O 带来的性能开销。该参数会额外提升 20% 的索引创建性能。## 使用说明

PolarDB-PG HTAP 适用于日常业务中的 轻分析类业务,例如:对账业务,报表业务。

使用 MPP 进行分析型查询

PolarDB-PG 引擎默认不开启 MPP 功能。若您需要使用此功能,请使用如下参数:

  • polar_enable_px:指定是否开启 MPP 功能。默认为 OFF,即不开启。
  • polar_px_max_workers_number:设置单个节点上的最大 MPP Worker 进程数,默认为 30。该参数限制了单个节点上的最大并行度,节点上所有会话的 MPP workers 进程数不能超过该参数大小。
  • polar_px_dop_per_node:设置当前会话并行查询的并行度,默认为 1,推荐值为当前 CPU 总核数。若设置该参数为 N,则一个会话在每个节点上将会启用 N 个 MPP Worker 进程,用于处理当前的 MPP 逻辑
  • polar_px_nodes:指定参与 MPP 的只读节点。默认为空,表示所有只读节点都参与。可配置为指定节点参与 MPP,以逗号分隔
  • px_worker:指定 MPP 是否对特定表生效。默认不生效。MPP 功能比较消耗集群计算节点的资源,因此只有对设置了 px_workers 的表才使用该功能。例如:
    • ALTER TABLE t1 SET(px_workers=1) 表示 t1 表允许 MPP
    • ALTER TABLE t1 SET(px_workers=-1) 表示 t1 表禁止 MPP
    • ALTER TABLE t1 SET(px_workers=0) 表示 t1 表忽略 MPP(默认状态)

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

-- 创建 test 表并插入基础数据。 CREATE TABLE test(id int); INSERT INTO test SELECT generate_series(1,1000000); -- 默认情况下 MPP 功能不开启,单表查询执行计划为 PG 原生的 Seq Scan EXPLAIN SELECT * FROM test; QUERY PLAN -------------------------------------------------------- Seq Scan on test (cost=0.00..35.50 rows=2550 width=4) (1 row)
复制

开启并使用 MPP 功能:

-- 对 test 表启用 MPP 功能 ALTER TABLE test SET (px_workers=1); -- 开启 MPP 功能 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)
复制

配置参与 MPP 的计算节点范围:

-- 查询当前所有只读节点的名称 CREATE EXTENSION polar_monitor; SELECT name,host,port FROM polar_cluster_info WHERE px_node='t'; name | host | port -------+-----------+------ node1 | 127.0.0.1 | 5433 node2 | 127.0.0.1 | 5434 (2 rows) -- 当前集群有 2 个只读节点,名称分别为:node1,node2 -- 指定 node1 只读节点参与 MPP SET polar_px_nodes = 'node1'; -- 查询参与并行查询的节点 SHOW polar_px_nodes; polar_px_nodes ---------------- node1 (1 row) EXPLAIN SELECT * FROM test; QUERY PLAN ------------------------------------------------------------------------------- PX Coordinator 1:1 (slice1; segments: 1) (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)
复制

使用 MPP 进行分区表查询

当前 MPP 对分区表支持的功能如下所示:

  • 支持 Range 分区的并行查询
  • 支持 List 分区的并行查询
  • 支持单列 Hash 分区的并行查询
  • 支持分区裁剪
  • 支持带有索引的分区表并行查询
  • 支持分区表连接查询
  • 支持多级分区的并行查询
--分区表 MPP 功能默认关闭,需要先开启 MPP 功能 SET polar_enable_px = ON; -- 执行以下语句,开启分区表 MPP 功能 SET polar_px_enable_partition = true; -- 执行以下语句,开启多级分区表 MPP 功能 SET polar_px_optimizer_multilevel_partitioning = true;
复制

使用 MPP 加速索引创建

当前仅支持对 B-Tree 索引的构建,且暂不支持 INCLUDE 等索引构建语法,暂不支持表达式等索引列类型。

如果需要使用 MPP 功能加速创建索引,请使用如下参数:

  • polar_px_dop_per_node:指定通过 MPP 加速构建索引的并行度。默认为 1
  • polar_px_enable_replay_wait:当使用 MPP 加速索引构建时,当前会话内无需手动开启该参数,该参数将自动生效,以保证最近更新的数据表项可以被创建到索引中,保证索引表的完整性。索引创建完成后,该参数将会被重置为数据库默认值。
  • polar_px_enable_btbuild:是否开启使用 MPP 加速创建索引。取值为 OFF 时不开启(默认),取值为 ON 时开启。
  • polar_bt_write_page_buffer_size:指定索引构建过程中的写 I/O 策略。该参数默认值为 0(不开启),单位为块,最大值可设置为 8192。推荐设置为 4096
    • 当该参数设置为不开启时,在索引创建的过程中,对于索引页写满后的写盘方式是 block-by-block 的单个块写盘。
    • 当该参数设置为开启时,内核中将缓存一个 polar_bt_write_page_buffer_size 大小的 buffer,对于需要写盘的索引页,会通过该 buffer 进行 I/O 合并再统一写盘,避免了频繁调度 I/O 带来的性能开销。该参数会额外提升 20% 的索引创建性能。```language
SET polar_px_enable_btbuild = on;

-- 使用如下语法创建索引
CREATE INDEX t ON test(id) WITH(px_build = ON);

-- 查询表结构
\d test
               Table "public.test"
 Column |  Type   | Collation | Nullable | Default
--------+---------+-----------+----------+---------
 id     | integer |           |          |
 id2    | integer |           |          |
Indexes:
    "t" btree (id) WITH (px_build=finish)
复制
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论