本文介紹了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 |