文档

polar_ddl_manager

更新时间:

本文介绍了polar_ddl_manager插件的使用方法和示例等内容。

前提条件

支持的PolarDB PostgreSQL版的版本如下:

PostgreSQL 14(内核小版本14.10.17.0及以上)

说明

您可通过如下语句查看PolarDB PostgreSQL版的内核小版本的版本号:

select version();

背景信息

在PostgreSQL中,增加分区表varchar列长度时,会自动重建被修改列相关的索引,导致ALTER TABLE执行效率很低。此外,ALTER TABLE需要持有ACCESS EXCLUSIVE锁,会长时间阻塞其他连接对该表的访问。

PolarDB PostgreSQL版支持polar_ddl_manager插件,提供了一些函数用于优化增加分区表varchar列长度的执行效率。

使用方法

安装插件

CREATE EXTENSION polar_ddl_manager;

相关函数

  • polar_ddl_manager.alter_varchar_column_length_cmd

    该函数能获取增长varchar列长度的ALTER TABLE命令列表,可用于在执行DDL命令前检查命令是否正确。参数说明如下:

    参数

    说明

    parent_table_name

    分区表的名称。

    parent_table_schema

    分区表所在的schema。

    column_name

    需要增长的列名。

    target_len

    增长后的目标长度。

    novalidate

    是否要跳过分区约束检查,取值如下:

    • true(默认):跳过分区约束检查。

    • false:不跳过分区约束检查。

  • polar_ddl_manager.alter_varchar_column_length

    该函数会通过polar_ddl_manager.alter_varchar_column_length_cmd函数获取DDL命令并自动执行,完成分区表varchar列的增长。其主要流程如下:

    1. 对分区表及其子表加锁,并完成合法性检查。

    2. DETACH所有子分区。

    3. 修改分区表及其子表的varchar列长度。

    4. ATTACH所有子分区。

使用示例

CREATE TABLE t(a int, b varchar(10), c char(128)) PARTITION BY HASH (a);
CREATE TABLE t_p1 PARTITION OF t FOR VALUES WITH (MODULUS 2, REMAINDER 0);
CREATE TABLE t_p2 PARTITION OF t FOR VALUES WITH (MODULUS 2, REMAINDER 1);
CREATE index ON t(b);
INSERT INTO t SELECT i, i FROM generate_series(1, 1000000) i;
-- 增加b列的长度,不跳过分区约束的检查
SELECT polar_ddl_manager.alter_varchar_column_length('t', 'public', 'b', 15, false);
-- 增加b列的长度,跳过分区约束的检查
SELECT polar_ddl_manager.alter_varchar_column_length('t', 'public', 'b', 20);

卸载插件

DROP EXTENSION polar_ddl_manager;
说明

为了提高ATTACH PARTITION的速度,增加了NOCHECK_CONSTRAINT语法用于跳过分区约束的检查。完整语法如下:

ALTER TABLE [ IF EXISTS ] name
    ATTACH PARTITION partition_name { FOR VALUES partition_bound_spec | DEFAULT } [NOCHECK_CONSTRAINT]

用户需确保ATTACH的分区和DEFAULT的分区中的数据已经满足分区约束,否则会出现数据正确性问题

性能对比

测试所用到的表结构如下所示:

CREATE TABLE t(a int, b varchar(10), c char(128)) PARTITION BY HASH (a);
CREATE TABLE t_p1 PARTITION OF t FOR VALUES WITH (MODULUS 2, REMAINDER 0);
CREATE TABLE t_p2 PARTITION OF t FOR VALUES WITH (MODULUS 2, REMAINDER 1);

分别测试在不同数据量、有无索引的场景下的执行时间(单位为 ms),测试结果如下:

数据量

索引数量

原生ALTER

不跳过约束检查

跳过约束检查

100 MB

0

0.562

222.37

10.47

1

5592.84

204.43

10.96

1 GB

0

0.56

2122.05

10.64

1

28588.58

1943.39

11.65

10 GB

0

0.53

39535.99

10.58

1

271934.90

35554.38

11.64

  • 本页导读 (0)
文档反馈