创建分区表的主要语法包含两部分:创建主表和创建分区。

建主表语法如下:

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');

连接分区时需要指定分区上的约束。

posted on 2024-02-01 21:43  jl1771  阅读(47)  评论(0编辑  收藏  举报