CREATE TABLE PARTITION
功能描述
Vastbase在PostgreSQL兼容模式下支持兼容PG风格的声明式表分区语法。
使用PARTITION OF声明分区表的前提是父表已存在,创建父表时需要指定分区键和分区策略。
注意事项
该功能仅在数据库兼容模式为PG时能够使用(即创建DB时DBCOMPATIBILITY='PG'),在其他数据库兼容模式下不能使用该特性。
仅Vastbase G100 V2.2 Build 10(Patch No.12)及以后补丁版本支持此功能。
不支持对列存表进行分区。
PG分区表不支持创建为临时表,unlogged表。
分区必须与其所属的分区表的字段名和类型相同。对分区表字段名或类型的修改仅支持在父表上执行,修改将自动传播到所有分区。
TRUNCATE 操作会影响一个表及其所有分区,但也可以在单个分区上执行。
语法格式
创建分区表父表:
CREATE TABLE [ IF NOT EXISTS ] parent_table_name ( column_name data_type [ COLLATE collation ] [ column_constraint [ ... ] ) [ NOCOMPRESS ] PARTITION BY { RANGE | LIST | HASH } ( partition_key );
创建子分区:
CREATE TABLE [ IF NOT EXISTS ] partition_table_name PARTITION OF parent_table_name FOR VALUES { IN ( partition_value [, ...] ) | FROM ( { partition_value | MINVALUE | MAXVALUE } [, ...] ) TO ( { partition_value | MINVALUE | MAXVALUE } [, ...] ) | WITH ( MODULUS numeric_literal, REMAINDER numeric_literal ) } [ PARTITION BY { RANGE | LIST | HASH } ( partition_key ) ]
参数说明
[ IF NOT EXISTS ]
如果一个同名关系已经存在,不会抛出一个错误,而会发出一个通知,告知表已存在。
parent_table_name
分区表父表的名称。可以使用模式名称进行限定。
partition_table_name
要被创建的分区表的名称,可以使用模式名称进行限定。
column_name
新表中要创建的字段名。
data_type
字段的数据类型。
[ COLLATE collation ]
COLLATE子句指定列的排序规则(该列必须是可排列的数据类型)。
不支持指定除默认值以外的其它选项。
column_constraint
列约束。参考CREATE TABLE PARTITION。
[ NOCOMPRESS ]
表的压缩选项。
仅支持指定为默认值 NOCOMPRESS,表示不进行压缩。
PARTITION BY { RANGE | LIST | HASH } ( partition_key )
PARTITION BY声明分区方式,其中partition_key为分区键。
- RANGE:范围分区。
- LIST:列表分区。
- HASH:哈希分区。
FOR VALUES { IN | FROM | TO }
创建分区表时使用FOR VALUES创建为特定值的分区。
- 具有IN的形式用于列表分区。
- 具有FROM和TO的形式用于范围分区。
- 具有WITH的形式用于哈希分区。
partition_value
列表分区的键值,或范围分区的端点值(起始或终点)。
MINVALUE | MAXVALUE
MINVALUE 表示最小值,通常用于设置第一个范围分区的下边界。
MAXVALUE 表示最大值,通常用于设置最后一个范围分区的上边界。
在创建范围分区以指示列值没有下限或上限时,可以使用 MINVALUE 和 MAXVALUE。
WITH ( MODULUS numeric_literal, REMAINDER numeric_literal )
哈希分区通过为每个分区指定模数和余数来对表进行分区。每个分区将保存分区键的哈希值除以指定的模数将产生指定余数的行。
- numeric_literal:莫属,即Hash分区个数。
- numeric_literal:指Hash分区键取模的余数。余数必须是小于模数的非负整数。
示例
1、创建Range分区表,定义分区键为“id”字段。
create table tab2_1155786(id int unique,pid int,a1 text default 'test') partition by range(id);
2、创建基于父表的两个子分区,划定分区范围。
create table tp1_1155786 partition of tab2_1155786 for values from (1) to (5);
create table tp2_1155786 partition of tab2_1155786 for values from (5) to (30);
3、向分区表插入若干数据。
insert into tab2_1155786 values(1,2,'a'),(2,3,'b'),(3,4,'c'),(4,5,'d'),(20,NULL,'abcd');
4、查看分区表(父表)的数据。
select * from tab2_1155786;
返回结果如下:
id | pid | a1
----+-----+------
1 | 2 | a
2 | 3 | b
3 | 4 | c
4 | 5 | d
20 | | abcd
(5 rows)
5、查看两个子分区的数据:
select * from tp1_1155786;
select * from tp2_1155786;
返回结果依次如下:
id | pid | a1
----+-----+----
1 | 2 | a
2 | 3 | b
3 | 4 | c
4 | 5 | d
(4 rows)
id | pid | a1
----+-----+------
20 | | abcd
(1 row)
6、执行alter语句修改父表的字段名称。
alter table tab2_1155786 rename column a1 to col1;
7、修改后查看两个子分区:
select * from tp1_1155786;
select * from tp2_1155786;
各子分区的字段名称修改成功,返回结果如下:
id | pid | col1
----+-----+------
1 | 2 | a
2 | 3 | b
3 | 4 | c
4 | 5 | d
(4 rows)
id | pid | col1
----+-----+------
20 | | abcd
(1 row)
8、truncate清空分区表数据。
truncate tab2_1155786;
9、查看分区表数据。
select * from tab2_1155786;
返回结果如下,数据已被清空:
id | pid | col1
----+-----+------
(0 rows)