本文介绍了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列的增长。其主要流程如下:对分区表及其子表加锁,并完成合法性检查。
DETACH所有子分区。
修改分区表及其子表的varchar列长度。
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 |