PolarDB for PostgreSQLPolarDB for PostgreSQL
  • 架构简介
  • 快速部署
  • 进阶部署
  • 共享存储设备的准备

    • 阿里云 ECS + ESSD 云盘存储
  • 文件系统的准备

    • 格式化并挂载 PFS
  • 部署 PolarDB-PG 数据库

    • 基于单机文件系统部署
    • 基于 PFS 文件系统部署
  • 更多部署方式

    • 购买商业版
  • 日常运维

    • 备份恢复
    • 共享存储在线扩容
    • 计算节点扩缩容
    • Replica 节点在线 Promote
  • 问题诊断

    • CPU 使用率高的排查方法
  • 性能测试

    • TPC-C 测试
    • TPC-H 测试
  • 功能分类

    • 高性能
    • 高可用
    • 安全
    • 弹性跨机并行查询(ePQ)
    • 第三方插件
  • PolarDB for PostgreSQL

    • 特性总览
    • HTAP 架构详解
    • 缓冲区管理
    • DDL 同步
    • LogIndex
  • PostgreSQL

    • ANALYZE 源码解读
    • Sequence 使用、原理全面解析
  • 基于 Docker 容器开发
  • 定制开发环境
  • 贡献代码
  • 贡献文档
  • 编码风格
  • 问题报告
  • English
  • 简体中文
GitHub
  • 架构简介
  • 快速部署
  • 进阶部署
  • 共享存储设备的准备

    • 阿里云 ECS + ESSD 云盘存储
  • 文件系统的准备

    • 格式化并挂载 PFS
  • 部署 PolarDB-PG 数据库

    • 基于单机文件系统部署
    • 基于 PFS 文件系统部署
  • 更多部署方式

    • 购买商业版
  • 日常运维

    • 备份恢复
    • 共享存储在线扩容
    • 计算节点扩缩容
    • Replica 节点在线 Promote
  • 问题诊断

    • CPU 使用率高的排查方法
  • 性能测试

    • TPC-C 测试
    • TPC-H 测试
  • 功能分类

    • 高性能
    • 高可用
    • 安全
    • 弹性跨机并行查询(ePQ)
    • 第三方插件
  • PolarDB for PostgreSQL

    • 特性总览
    • HTAP 架构详解
    • 缓冲区管理
    • DDL 同步
    • LogIndex
  • PostgreSQL

    • ANALYZE 源码解读
    • Sequence 使用、原理全面解析
  • 基于 Docker 容器开发
  • 定制开发环境
  • 贡献代码
  • 贡献文档
  • 编码风格
  • 问题报告
  • English
  • 简体中文
GitHub
  • 自研功能
    • 功能分类

      • 高性能
        • 预读 / 预扩展
        • 表大小缓存
        • Shared Server
      • 高可用
        • 只读节点 Online Promote
        • WAL 日志并行回放
        • DataMax 日志节点
        • Resource Manager
        • 闪回表和闪回日志
      • 安全
        • TDE 透明数据加密
        • polar_login_history 会话访问历史
      • 弹性跨机并行查询(ePQ)
        • ePQ 执行计划查看与分析
        • ePQ 计算节点范围选择与并行度控制
        • ePQ 支持分区表查询
        • ePQ 支持创建 B-Tree 索引并行加速
        • 集群拓扑视图
        • 自适应扫描
        • 并行 INSERT
        • ePQ 支持创建/刷新物化视图并行加速和批量写入
      • 第三方插件
        • pgvector
        • smlar

并行 INSERT

V11 / v1.1.17-

渊云

2022/09/27

30 min

  • 背景介绍
  • 功能介绍
  • 使用方法
  • 使用说明
  • 原理介绍

背景介绍

PolarDB-PG 支持 ePQ 弹性跨机并行查询,能够利用集群中多个计算节点提升只读查询的性能。此外,ePQ 也支持在读写节点上通过多进程并行写入,实现对 INSERT 语句的加速。

功能介绍

ePQ 的并行 INSERT 功能可以用于加速 INSERT INTO ... SELECT ... 这种读写兼备的 SQL。对于 SQL 中的 SELECT 部分,ePQ 将启动多个进程并行执行查询;对于 SQL 中的 INSERT 部分,ePQ 将在读写节点上启动多个进程并行执行写入。执行写入的进程与执行查询的进程之间通过 Motion 算子 进行数据传递。

能够支持并行 INSERT 的表类型有:

  • 普通表
  • 分区表
  • (部分)外部表

并行 INSERT 支持动态调整写入并行度(写入进程数量),在查询不成为瓶颈的条件下性能最高能提升三倍。

使用方法

创建两张表 t1 和 t2,向 t1 中插入一些数据:

CREATE TABLE t1 (id INT);
CREATE TABLE t2 (id INT);
INSERT INTO t1 SELECT generate_series(1,100000);

打开 ePQ 及并行 INSERT 的开关:

SET polar_enable_px TO ON;
SET polar_px_enable_insert_select TO ON;

通过 INSERT 语句将 t1 表中的所有数据插入到 t2 表中。查看并行 INSERT 的执行计划:

=> EXPLAIN INSERT INTO t2 SELECT * FROM t1;
                                       QUERY PLAN
-----------------------------------------------------------------------------------------
 Insert on t2  (cost=0.00..952.87 rows=33334 width=4)
   ->  Result  (cost=0.00..0.00 rows=0 width=0)
         ->  PX Hash 6:3  (slice1; segments: 6)  (cost=0.00..432.04 rows=100000 width=8)
               ->  Partial Seq Scan on t1  (cost=0.00..431.37 rows=16667 width=4)
 Optimizer: PolarDB PX Optimizer
(5 rows)

其中的 PX Hash 6:3 表示 6 个并行查询 t1 的进程通过 Motion 算子将数据传递给 3 个并行写入 t2 的进程。

通过参数 polar_px_insert_dop_num 可以动态调整写入并行度,比如:

=> SET polar_px_insert_dop_num TO 12;
=> EXPLAIN INSERT INTO t2 SELECT * FROM t1;
                                        QUERY PLAN
------------------------------------------------------------------------------------------
 Insert on t2  (cost=0.00..952.87 rows=8334 width=4)
   ->  Result  (cost=0.00..0.00 rows=0 width=0)
         ->  PX Hash 6:12  (slice1; segments: 6)  (cost=0.00..432.04 rows=100000 width=8)
               ->  Partial Seq Scan on t1  (cost=0.00..431.37 rows=16667 width=4)
 Optimizer: PolarDB PX Optimizer
(5 rows)

执行计划中的 PX Hash 6:12 显示,并行查询 t1 的进程数量不变,并行写入 t2 的进程数量变更为 12。

使用说明

调整 polar_px_dop_per_node 和 polar_px_insert_dop_num 可以分别修改 INSERT INTO ... SELECT ... 中查询和写入的并行度。

  1. 当查询并行度较低时,逐步提升写入并行度,SQL 执行时间将会逐渐下降并趋于平缓;趋于平缓的原因是查询速度跟不上写入速度而成为瓶颈
  2. 当查询并行度较高时,逐步提升写入并行度,SQL 执行时间将会逐渐下降并趋于平缓;趋于平缓的原因是并行写入只能在读写节点上进行,写入速度因多个写入进程对表页面扩展锁的争抢而跟不上查询速度,成为瓶颈

原理介绍

ePQ 对并行 INSERT 的处理如下:

  1. ePQ 优化器以查询解析得到的语法树作为输入,产生计划树
  2. ePQ 执行器将计划树分发到各计算节点,并创建并行查询/并行写入进程,开始执行各自负责执行的子计划
  3. 并行查询进程从存储中并行读取各自负责的数据分片,并将数据发送到 Motion 算子
  4. 并行写入进程从 Motion 算子中获取数据,向存储并行写入数据

并行查询和并行写入是以流水线的形式同时进行的。上述执行过程如图所示:

parallel_insert_data_flow

在 GitHub 上编辑此页
上次更新:
贡献者: Shijun.Zhou
Prev
自适应扫描
Next
ePQ 支持创建/刷新物化视图并行加速和批量写入