跨机并行查询功能还可以用于加速构建B-tree索引,同时支持加速创建B-Tree索引的GLOBAL索引。本文介绍工作原理以及如何使用该功能加速索引构建。

原理介绍

PolarDB PostgreSQL版在执行索引构建时,会首先扫描待构建索引的基表构造出索引项,然后再进一步的根据索引项完成整棵索引树的构建过程。

当使用跨机并行查询功能加速Btree索引构建时,系统会自动构建出一个QC进程完成对基表项的并行扫描,并由索引构建进程接收QC进程扫描结果完成后续的索引创建逻辑。

索引加速架构图(PX)

注意事项

  • 当前仅支持简单场景,对普通列类型的索引构建过程,暂不支持CONCURRENTLY,INCLUDE等索引构建语法。
  • 暂不支持表达式等索引列类型。

参数说明

如果需要使用跨机并行查询功能加速创建索引,请使用如下参数:

参数说明
polar_px_enable_btbuild是否开启使用跨机并行查询加速创建索引。取值如下:
  • off:不开启(默认)
  • on:开启
polar_px_dop_per_node指定通过跨机并行查询加速构建索引的并行度。默认为1,推荐值8或者16。

该参数同时也指定了跨机并行查询的并行度。详细信息,请参见使用跨机并行查询进行分析型查询

该参数可以指定数据库角色进行开启。

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

示例

示例背景:

执行如下命令,创建test表。

CREATE TABLE test(id int,id2 int);

查询表结构:

\d test
               Table "public.test"
 Column |  Type   | Collation | Nullable | Default
--------+---------+-----------+----------+---------
 id     | integer |           |          |
 id2    | integer |           |          |

执行如下步骤,对test表通过跨机并行查询构建索引。

  1. 开启使用跨机并行查询加速创建索引功能。
    命令如下:
    SET polar_px_enable_btbuild=on;

    查看设置状态:

    SHOW polar_px_enable_btbuild;

    返回结果如下:

      polar_px_enable_btbuild
    -------------------------
     on
    (1 row)
  2. 使用如下语法创建索引。
    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)
说明 若要使用跨机并行查询加速索引创建,创建索引的语法需要添加px_build选项。

构建完成后,该表的索引类型会带有(px_build=finish)字段,说明该索引项是通过跨机并行查询的方式构建的。

如果开启polar_px_enable_btbuild,但创建索引的语法上未添加px_build选项,则会使用PolarDB PostgreSQL版原生的索引创建方式构建索引。示例如下:

CREATE INDEX t ON test(id);

查询表结构:

\d test
                Table "public.test"
 Column |  Type   | Collation | Nullable | Default
--------+---------+-----------+----------+---------
 id     | integer |           |          |
Indexes:
    "t" btree (id)

性能数据

使用跨机并行查询加速索引构建功能,对于大表创建索引时间,相较于原生PolarDB PostgreSQL版的索引创建,可缩短近5倍。

如下是500GB数据表索引构建性能对比,横坐标为构建的复合索引个数,纵坐标为索引构建时长(单位:ms)。

索引构建时间(跨机并行查询)