日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

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