全部產品
Search
文件中心

PolarDB:分區分裂

更新時間:Jul 06, 2024

注意事項

  • 本文要求PolarDB-X執行個體版本必須為5.4.14-16539836及以上;

  • 若要對二級分區進行分區分裂操作,要求PolarDB-X執行個體版本必須為5.4.17-16952556及以上。

  • 分裂後指定新分區的定義時,新分區必須滿足原分區下的資料約束,禁止出現分裂後原有資料無法路由到任何新分區的情況。

名詞解釋

  • 表組:分區列完全相同的一組邏輯表或全域索引表的集合。

  • 全域索引:使用另一個維度進行水平資料分割的資料與主表始終保持強一致的分區表。

文法

ALTER { TABLE tbl_name | TABLEGROUP tg_name | TABLEGROUP BY TABLE tbl_name } 
		split_partition_specs_definition
 | split_subpartition_specs_definition

 
split_partition_specs_definition:
SPLIT PARTITION part_name [INTO (partition_specs_definition)]
| SPLIT PARTITION part_name into partitions partitions_count
| SPLIT PARTITION part_name at(#value) into (partition part_name, partition part_name)

split_subpartition_specs_definition:
SPLIT SUBPARTITION subpartition_name [INTO (subpartition_specs_definition)]
| SPLIT SUBPARTITION subpartition_name into subpartitions subpartitions_count
| SPLIT SUBPARTITION subpartition_name at(#value) into (subpartition subpartition_name, subpartition subpartition_name)


partition_specs_definition:
 range_partition_list
 | list_partition_list

subpartition_specs_definition:
 range_subpartition_list
 | list_subpartition_list

range_partition_list:
 ( range_partition [, range_partition, ... ] )

range_partition:
 	PARTITION partition_name VALUES LESS THAN (range_bound_value) 

# 二級分區的Range/Range Columns分區定義
range_subpartition_list:
	( range_subpartition [, range_subpartition, ... ] )

range_subpartition:
 SUBPARTITION subpartition_name VALUES LESS THAN (range_bound_value) [partition_spec_options]

list_partition_list:
 (list_partition [, list_partition ...])

list_partition:
 	PARTITION partition_name VALUES IN (list_bound_value) [partition_spec_options] 

# 二級分區的List/List Columns分區定義
list_subpartition_list:
	(list_subpartition [, list_subpartition ...])

list_subpartition:
	SUBPARTITION subpartition_name VALUES IN (list_bound_value) [partition_spec_options]
說明

其中ALTER TABLEGROUP BY TABLE tbl_name是根據表名[db_name.]tbl_name自動尋找目標表的表組tg_name進行表組級的分區分裂,語義上與給定具體表組名的SQL:ALTER TABLEGROUP tg_name進行分區操作是一樣的。

情境1:目標資料分割為不包含二級分區的一級分區

Range/Range column分區表分裂

表級用法

假設表tb1的定義為:

CREATE TABLE tb1(a int) PARTITION BY RANGE(a)
 (PARTITION p1 VALUES LESS THAN(20), 
 PARTITION p2 VALUES LESS THAN(100))

通過以下SQL將p1分裂成p10、p11、p12:

ALTER TABLE tb1 SPLIT PARTITION p1 INTO 
(PARTITION p10 VALUES LESS THAN (8),
PARTITION p11 VALUES LESS THAN(15),
PARTITION p12 VALUES LESS THAN(20))

對於range分區表,PolarDB-X提供一個文法糖,支援將一個range在其範圍內按任意點一分為二。例如對於tb1表,執行如下文法可以將分區p1分裂:

ALTER TABLE tb1 SPLIT PARTITION p1 AT(9) INTO (partition p11, partition p12)

這個sql等價於以下語句:

ALTER TABLE tb1 SPLIT PARTITION p1 INTO 
(PARTITION p11 VALUES LESS THAN(9),
PARTITION p12 VALUES LESS THAN(20));

表組級用法

說明

對錶組的分區進行分裂,意味著表組內所有表的相應分區會同步進行分裂。

假設表tb1、tb2的分區定義一致,且在同一個表組mytg1(名字唯一即可,樣本中全部以mytg1為例):

create tablegroup mytg1;
CREATE TABLE tb1(a int) PARTITION BY RANGE(a)
 (PARTITION p1 VALUES LESS THAN(20), 
 PARTITION p2 VALUES LESS THAN(100)) tablegroup=mytg1;
 
CREATE TABLE tb2(a int) PARTITION BY RANGE(a)
 (PARTITION p1 VALUES LESS THAN(20), 
 PARTITION p2 VALUES LESS THAN(100)) tablegroup=mytg1; 

可以通過以下SQL將表組mytg1的p1分裂成p10、p11、p12(意味著tb1和tb2的分區p1會被同步的分裂成p10、p11、p12):

ALTER TABLEGROUP mytg1 SPLIT PARTITION p1 INTO 
(PARTITION p10 VALUES LESS THAN (8),
PARTITION p11 VALUES LESS THAN(15),
PARTITION p12 VALUES LESS THAN(20))

對於range分區表表組,PolarDB-X提供一個文法糖,支援將一個range在其範圍內按任意點一分為二。例如對於表組mytg1,執行如下文法可以將分區p1分裂:

ALTER TABLEGROUP mytg1 SPLIT PARTITION p1 AT(9) INTO (partition p11, partition p12)

這個SQL等價於以下語句:

ALTER TABLEGROUP mytg1 SPLIT PARTITION p1 INTO 
(PARTITION p11 VALUES LESS THAN(9),
PARTITION p12 VALUES LESS THAN(20));

List/List column分區表分裂

表級用法

假設表tb1的定義為:

CREATE TABLE tb1(a int) PARTITION BY LIST(a)
 (PARTITION p1 VALUES IN(1, 2, 3, 4, 5, 6), 
 PARTITION p2 VALUES IN(7,8,9),
 PARTITION p3 VALUES IN(default))

執行以下SQL可以將p1分裂成p10、p11、p12:

ALTER TABLE tb1 SPLIT PARTITION p1 INTO 
(PARTITION p10 VALUES IN (1,3,5),
PARTITION p11 VALUES IN (2,4),
PARTITION p12 VALUES IN (6))

對於分區p3,它是default分區,意味著1~9之外的分區鍵對應的值全部落到它上面,對於default分區,PolarDB-X也允許將部分value從default分區中分裂出來,例如將10~15從p3中分裂出來:

ALTER TABLE tb1 SPLIT PARTITION p3 INTO 
(PARTITION p30 VALUES IN (10,11,12),
PARTITION p31 VALUES IN (13,14,15),
PARTITION p32 VALUES IN (default))

表組級用法

說明

對錶組的分區分裂,意味著表組內所有表的相應分區會同步進行分裂。

假設表tb1、tb2的分區定義一致,且在一個表組mytg1(名字唯一即可,執行個體中全部以mytg1為例):

create tablegroup mytg1;
CREATE TABLE tb1(a int) PARTITION BY LIST(a)
 (PARTITION p1 VALUES IN(1, 2, 3, 4, 5, 6), 
 PARTITION p2 VALUES IN(7,8,9),
 PARTITION p3 VALUES IN(default)) tablegroup=mytg1;
 
CREATE TABLE tb2(a int) PARTITION BY LIST(a)
 (PARTITION p1 VALUES IN(1, 2, 3, 4, 5, 6), 
 PARTITION p2 VALUES IN(7,8,9),
 PARTITION p3 VALUES IN(default)) tablegroup=mytg1; 

可以通過以下SQL將p1分裂成p10、p11、p12(意味著tb1和tb2的分區p1會被同步的分裂成p10、p11、p12):

ALTER TABLEGROUP mytg1 SPLIT PARTITION p1 INTO 
(PARTITION p10 VALUES IN (1,3,5),
PARTITION p11 VALUES IN (2,4),
PARTITION p12 VALUES IN (6))

對於分區p3,它是default分區,意味著1~9之外的分區鍵對應的值全部落到它上面,對於default分區,PolarDB-X也允許將部分value從default分區中分裂出來,例如將10~15從p3中分裂出來:

ALTER TABLEGROUP mytg1 SPLIT PARTITION p3 INTO 
(PARTITION p30 VALUES IN (10,11,12),
PARTITION p31 VALUES IN (13,14,15),
PARTITION p32 VALUES IN (default))

Hash/key分區表分裂

表級用法

假設表tb1的定義為:

CREATE TABLE tb1(a int) PARTITION BY key(a) partitions 3;

預設的三個分區的名字依次是p1、p2、p3。

執行以下SQL可以將p1分裂成兩個分區,這兩個新分區是在原p1的hash空間範圍內將其按hash空間範圍一分為二:

ALTER TABLE tb1 split partition p1

也可以將分區分裂成指定數目的多個分區。例如將p2分裂成5個分區,這5個新分區是在原p1的hash空間範圍內將其按hash空間範圍一分為五:

ALTER TABLE tb1 split partition p2 INTO partitions 5

表組級用法

說明

對錶組的分區分裂,意味著表組內所有表的相應分區會同步進行分裂。

假設表tb1、tb2的分區定義一致,且在同一個表組mytg1(名字唯一即可,執行個體中全部以mytg1為例):

CREATE tablegroup mytg1;
CREATE TABLE tb1(a int) PARTITION BY key(a) partitions 3 tablegroup=mytg1;
CREATE TABLE tb2(a int) PARTITION BY key(a) partitions 3 tablegroup=mytg1;

預設的表的三個分區的名字依次是p1、p2、p3。

執行以下SQL可以將表組的p1分裂成兩個分區,這兩個新分區是在原p1的hash空間範圍內將其按hash空間範圍一分為二:

ALTER tablegroup mytg1 split partition p1

也可以將分區分裂成指定數目的多個分區,例如將p2分裂成5個分區,這5個新分區是在原p1的hash空間範圍內將其按hash空間範圍一分為五:

ALTER tablegroup mytg1 split partition p2 into partitions 5

情境2:目標資料分割為含有二級分區的一級分區

情境1中對應的分區策略的執行個體,同樣適應於情境2。

表級用法

對於二級分區是非模板化,可以在分裂一級分區的時候重新定義子分區,例如對於以下表:

CREATE TABLE t1 (
a bigint unsigned NOT null,
b bigint unsigned NOT null,
c datetime NOT NULL,
d varchar(16) NOT NULL,
e varchar(16) NOT NULL
)
partition BY key (a,b) partitions 4
subpartition BY range columns (c,d)
(
partition p1
(
subpartition p1sp1 VALUES less than ( '2020-01-01', 'abc' ),
subpartition p1sp2 VALUES less than ( maxvalue, maxvalue )
),
partition p2
(
subpartition p2sp1 VALUES less than ( '2020-01-01', 'abc' ),
subpartition p2sp2 VALUES less than ( '2021-01-01', 'abc' ),
subpartition p2sp3 VALUES less than ( '2022-01-01', 'abc' ),
subpartition p2sp4 VALUES less than ( maxvalue, maxvalue )
),
partition p3
(
subpartition p3sp1 VALUES less than ( '2020-01-01', 'abc' ),
subpartition p3sp2 VALUES less than ( maxvalue, maxvalue )
),
partition p4
(
subpartition p4sp1 VALUES less than ( '2020-01-01', 'abc' ),
subpartition p4sp2 VALUES less than ( maxvalue, maxvalue )
)
);

和情境1一樣,在分裂一級分區時可以這樣執行:

ALTER TABLE t1 split partition p1;

同時也支援分裂時重新定義子分區:

ALTER TABLE t1 split partition p1 INTO (
 partition p10 (subpartition p10sp1 VALUES less than('2020-01-01', 'abc'),
 subpartition p10sp2 VALUES less than('2022-01-01', 'abc'),
 subpartition p10sp3 VALUES less than(maxvalue, maxvalue)),
 partition p11 (subpartition p11sp1 VALUES less than(maxvalue, maxvalue)));

以上命令將p1分裂成兩個新的一級分區p10、p11,同時指定p10分區下包括3個子分區, p11分區下只包括1個子分區。

重要

新定義的子分區必須滿足原分區下的資料約束,不能出現分裂後原有資料無法路由到任何新分區的情況。

對於二級分區是模板化分區,不允許在分裂一級分區時更改子分區的定義。

表組級用法

和表級類似,僅需將文法規則alter table #tb改成alter tablegroup #tgnamealter tablegroup by #tb

情境3:目標資料分割為模板化的二級分區

當二級分區是模板化分區時,可以通過分裂文法直接將某個模板二級分區分裂,分裂模板二級分區會使所有的一級分區下的子分區同時分裂。

模板化二級分區是Range/Range column策略的分區表分裂

表級用法

假設表tb1的定義為:

CREATE TABLE tb1 (
a bigint unsigned NOT null,
b bigint unsigned NOT null,
c bigint NOT NULL,
d varchar(16) NOT NULL,
e varchar(16) NOT NULL
)
partition BY key (a,b) partitions 4
subpartition BY range (c) (
 subpartition sp1 VALUES less than ( 1000 ),
 subpartition sp2 VALUES less than ( 2000 ),
 subpartition sp3 VALUES less than ( maxvalue )
);

可以通過以下SQL將sp2分裂成sp20、sp21、sp22:

ALTER TABLE tb1 split subpartition sp2 INTO 
(partition sp20 VALUES less than (1200),
partition sp21 VALUES less than(1600),
partition sp22 VALUES less than(2000))

對於range分區表,PolarDB-X提供一個文法糖,支援將一個range在其範圍內按任意點一分為二,例如對於tb1表,執行以下SQL將分區sp2分裂:

ALTER TABLE tb1 split subpartition sp2 at(1600) INTO
(subpartition sp21, subpartition p22)

這個SQL等價於以下語句:

ALTER TABLE tb1 split subpartition sp2 INTO
(partition sp21 VALUES less than(1600),
partition sp22 VALUES less than(2000));

表組級用法

說明

對錶組的分區分裂,意味著表組內所有表的相應分區會同步進行分裂。

和表級類似,僅需將文法規則alter table #tb改成alter tablegroup #tgnamealter tablegroup by #tb

模板化二級分區是List/List column策略的分區表分裂

表級用法

假設表tb1的定義為:

CREATE TABLE tb1 (
a bigint unsigned NOT null,
b bigint unsigned NOT null,
c datetime NOT NULL,
d varchar(16) NOT NULL,
e varchar(16) NOT NULL
)
partition BY key (a,b) partitions 4
subpartition BY list (to_days(c)) (
subpartition sp1 VALUES IN ( to_days('2020-01-01'),to_days('2020-02-01'),to_days('2020-03-01'),to_days('2020-04-01') ),
subpartition sp2 VALUES IN ( default )
);

執行以下SQL將sp1分裂成p10、p11、p12:

ALTER TABLE tb1 split subpartition sp1 INTO 
(subpartition sp10 VALUES IN (to_days('2020-01-01')),
subpartition sp11 VALUES IN (to_days('2020-02-01'),to_days('2020-04-01')),
subpartition sp12 VALUES IN (to_days('2020-03-01')))

對於分區sp2,它是default分區,意味著列c的值除了('2020-01-01','2020-02-01', '2020-03-01', '2020-04-01')之外的分區鍵對應的值全部落到它上面。對於default分區,PolarDB-X也允許將部分value從default分區中分裂出來,例如將'2023-01-01','2023-02-01','2023-03-01'從sp2中分裂出來:

ALTER TABLE tb1 split subpartition sp2 INTO 
(subpartition sp20 VALUES IN (to_days('2023-01-01')),
subpartition sp21 VALUES IN (to_days('2023-02-01'),to_days('2023-03-01')),
subpartition sp22 VALUES IN (default))

表組級用法

說明

對錶組的分區分裂,意味著表組內所有表的相應分區會同步進行分裂。

和表級類似,僅需將文法規則alter table #tb改成alter tablegroup #tgnamealter tablegroup by #tb

模板化二級分區是Hash/key策略的分區表分裂

表級用法

假設表tb1的定義為:

CREATE TABLE tb1 (
a bigint unsigned NOT null,
b bigint unsigned NOT null,
c datetime NOT NULL,
d varchar(16) NOT NULL,
e varchar(16) NOT NULL
)
partition BY key (c,d) partitions 3
subpartition BY key (a,b) subpartitions 3;

預設的一級分區的名字依次是p1、p2、p3,模板子分區的名稱依次是sp1、sp2、sp3。

可以通過以下文法,將sp1分裂成兩個分區,這兩個新分區是在原sp1的hash空間範圍內將其按hash空間範圍一分為二:

ALTER TABLE tb1 split subpartition sp1

也可以將分區分裂成指定數目的多個分區,例如將sp2分裂成5個分區,這5個新分區是在原p1的hash空間範圍內將其按hash空間範圍一分為五:

ALTER TABLE tb1 split subpartition sp2 INTO subpartitions 5

表組級用法

說明

對錶組的分區分裂,意味著表組內所有表的相應分區會同步進行分裂。

和表級類似,僅需將文法規則alter table #tb改成alter tablegroup #tgnamealter tablegroup by #tb

情境4:目標資料分割是非模板化的二級分區

說明

和情境3不一樣,對於二級分區是非模板化分區,可以通過分裂文法直接將某個二級分區分裂,僅分裂該二級分區本身。

情境3中對應的分區策略的執行個體,同樣適應於情境4,具體文法請參考情境3:目標資料分割為模板化的二級分區