创建分区表
规格约束
单个表的最大分区数为1048575(包括一级分区和二级分区)。较多的分区会导致系统中文件数增加、占用更多的系统缓存和锁资源,进而影响系统的性能。在默认配置下,建议单个表的分区数不超过400。如果实际使用的热点分区数超过400,考虑到分区表的使用性能,建议调整FASTPATH_PART的值(调整方法参见GUC参数num_internal_lock_partitions),调整配置后,建议单个表的分区数不超过2000。
创建普通分区表(创建一级分区表)
SQL语言具备强大且灵活多样的功能,其语法树往往较为复杂,分区表亦是如此。分区表的创建可视为在原有非分区表的基础上增添表分区属性。所以,分区表的语法接口可看作是对原有非分区表CREATE TABLE语句的扩展,具体是增加了PARTITION BY语句部分,同时需指定与分区相关的三个核心元素:
- 分区类型(partType):用于描述分区表所采用的分区策略,主要包括范围分区、列表分区和哈希分区。
- 分区键(partKey):用于确定分区表的分区列。目前,范围分区和列表分区支持多列(不超过16列)作为分区键,而哈希分区仅支持单列分区。
- 分区表达式(partExpr):用于描述分区表具体的分区方式,也就是键值与分区之间的对应映射关系。
CREATE TABLE [ IF NOT EXISTS ] partition_table_name
(
[ /* 该部分继承于普通表的Create Table */
{ column_name data_type [ COLLATE collation ] [ column_constraint [ ... ] ]
| table_constraint
| LIKE source_table [ like_option [...] ] }[, ... ]
]
)
[ WITH ( {storage_parameter = value} [, ... ] ) ]
[ COMPRESS | NOCOMPRESS ]
[ TABLESPACE tablespace_name ]
/* 范围分区场景 */
PARTITION BY RANGE (partKey) (
{ partition_start_end_item [, ... ] | partition_less_then_item [, ... ] }
)
/* 列表分区场景 */
PARTITION BY LIST (partKey)
(
PARTITION partition_name VALUES (list_values_clause) [ TABLESPACE tablespace_name [, ... ] ]
...
)
/* 哈希分区场景 */
PARTITION BY HASH (partKey) (
PARTITION partition_name [ TABLESPACE tablespace_name [, ... ] ]
...
)
/* 开启/关闭分区表行迁移 */
[ { ENABLE | DISABLE } ROW MOVEMENT ]; - 范围分区和列表分区最大支持16个分区键,而哈希分区只支持1个分区键。
- 除哈希分区外,分区键不能插入空值,否则DML语句会进行报错处理。但是当范围分区表定义了MAXVALUE分区,或者列表分区表定义了DEFAULT分区时,允许插入空值。
创建二级分区表
二级分区表可视为一级分区表的进一步拓展。在二级分区表结构里,第一层分区是一张逻辑表,并不实际承担数据存储功能,数据真正的存储位置是二级分区节点。
从实现上而言,二级分区表的分区方案是由两个一级分区嵌套而来,一级分区的分区策略详见《参考》中“SQL参考 > SQL语法 > C > CREATE TABLE PARTITION”章节。
CREATE TABLE [ IF NOT EXISTS ] subpartition_table_name
(
[ /* 该部分继承于普通表的Create Table */
{ column_name data_type [ COLLATE collation ] [ column_constraint [ ... ] ]
| table_constraint
| LIKE source_table [ like_option [...] ] } [, ... ]
]
)
[ WITH ( {storage_parameter = value} [, ... ] ) ]
[ COMPRESS | NOCOMPRESS ]
[ TABLESPACE tablespace_name ]
PARTITION BY {RANGE | LIST | HASH} (partKey) SUBPARTITION BY {RANGE | LIST | HASH} (partKey)
(
PARTITION partition_name partExpr… /* 第一层分区 */
(
SUBPARTITION partition_name partExpr … /* 第二层分区 */
SUBPARTITION partition_name partExpr … /* 第二层分区 */
),
PARTITION partition_name partExpr… /* 第一层分区 */
(
SUBPARTITION partition_name partExpr … /* 第二层分区 */
SUBPARTITION partition_name partExpr … /* 第二层分区 */
),
…
)
[ { ENABLE | DISABLE } ROW MOVEMENT ]; 规格约束:
二级分区表支持列表/哈希/范围分区的任意两两组合。
修改分区属性
- 增加分区
- 删除分区
- 删除/清空分区数据
- 切割分区
- 合并分区
- 移动分区
- 交换分区
- 重命名分区
/* 基本alter table语法 */
ALTER TABLE [ IF EXISTS ] { table_name [*] | ONLY table_name | ONLY ( table_name )}
action [, ... ]; 分区表ALTER TABLE语句使用方法请参见分区表运维管理、《参考》中“SQL参考 > SQL语法 > A > ALTER TABLE PARTITION”和“SQL参考 > SQL语法 > A > ALTER TABLE SUBPARTITION”章节。