创建分区表的主要语法包含两部分:创建主表和创建分区。
建主表语法如下:
CREATE TABLE table name ( ... )
[ PARTITION BY { RANGE I LIST ) ( { column name I ( expression ) )
创建主表时须指定分区方式,可选的分区方式为 RANGE 范围分区或 LIST 表分区,并指定宇段或表达式作为分区键。
创建分区的语法如下:
CREATE TABLE table name
PARTITION OF parent_table [ (
) ] FOR VALUES partition_bound_spec
创建分区时必须指定是哪张表的分区,同时指定分区策略 partition_bound_spec,如果是范围分区,partition_bound_spec 须指定每个分区分区键的取值范围 ,如果是列表分区 partition_bound_spec,需指定每个分区的分区键值。
例子:
CREATE TABLE log_par(
id serial,
user_id int4,
create_time timestamp(0) without time zone
) PARTITION BY RANGE(create_time);
表 log_par 指定了分区策略为范围分区,分区键为 create_time 宇段。
创建分区,并设置分区的分区键取值范围,如下所示:
CREATE TABLE log_par_his PARTITION OF log_par FOR VALUES FROM ('2000-01-01') TO ('2024-01-01');
CREATE TABLE log_par_202401 PARTITION OF log_par FOR VALUES FROM ('2024-01-01') TO ('2024-02-01');
CREATE TABLE log_par_202402 PARTITION OF log_par FOR VALUES FROM ('2024-02-01') TO ('2024-03-01');
...
CREATE TABLE log_par_202412 PARTITION OF log_par FOR VALUES FROM ('2024-12-01') TO ('2025-01-01');
注意分区的分区键范围不要有重叠,定义分区键范围实质上给分区创建了约束。给所有分区的分区键创建索引,如下所示:
CREATE INDEX idx_log_par_his_ctime ON log_par_his USING btree(create_time);
CREATE INDEX idx_log_par_202401_ctime ON log_par_202401 USING btree(create_time);
CREATE INDEX idx_log_par_202402_ctime ON log_par_202402 USING btree(create_time);
...
CREATE INDEX idx_log_par_202412_ctime ON log_par_202412 USING btree(create_time);
以上三步完成了内置分区表的创建。
内置分区表原理探索
内置分区表原理实际上和传统分区表一样,也是使用继承方式,分区可称为子表,通过以下查询很明显看出表 log_par 和其分区是继承关系:
\d+ log_par
添加分区
添加分区的操作比较简单,例如给 log_par 增加一个分区,如下所示:
CREATE TABLE log_par_202501 PARTITION OF log_par FOR VALUES FROM ('2025-01-01') TO ('2025-02-01');
之后给分区创建索引,如下所示:
CREATE INDEX idx_log_par_202501_ctime ON log_par_202501 USING btree(create_time);
删除分区
删除分区有两种方法,第一种方法通过 DROP 分区的方式来删除,如下所示:
DROP TABLE log_par_202501;
DROP 方式直接将分区和分区数据删除,删除前需确认分区数据是否需要备份,避免数据丢失。另一种推荐的方法是解绑分区,如下所示:
ALTER TABLE log_par DETACH PARTITION log_par_202501;
解绑分区只是将分区和父表间的关系断开,分区和分区数据依然保留,这种方式比较稳妥,如果后续需要恢复这个分区,通过连接分区方
式恢复分区即可,如下所示:
ALTER TABLE log_par ATTACH PARTITION log_par_202501 FOR VALUES FROM ('2025-01-01') TO ('2025-02-01');
连接分区时需要指定分区上的约束。