PostgreSQL09-分区表
9.分区表
什么是分区表
分区表就是根据分区策略,将数据数据分散到不同的子表中,并通过父表建立关联关系,从而实现数据物理上的分区。
PG10版本之前,使用继承+触发器实现分区表,步骤较为繁琐。
PG10版本开始,采用内置分区,只支持范围分区和列表分区,PG11支持HASH分区
创建分区表
1.创建父表,指定分区键和分区策略。
create table log_par(
id serial,
user_id int4,
create_time timestamp(0) without time zone)
partition by range(create_time); 分区方式:范围分区。分区键:create_time
2.创建分区,指定分区表的父表和分区键的取值范围,注意分区键的范围不可重叠。
create table log_par_history partition of log_par for value from (unbouned) to ('2017-01-01');
create table log_par_201701 partition of log_par for value from ('2017-01-01') to ('2017-02-01');
create table log_par_201702 partition of log_par for value from ('2017-02-01') to ('2017-03-01');
...
按创建时间分区,一个月一张表
3.在分区上创建相应索引,通常情况必须给分区键创建索引,非分区键的索引可根据实际应用场景选择是否创建。
create index idx_log_par_history_ctime on log_par_history using btree(create_time);
create index idx_log_par_201701_ctime on log_par_201701 using btree(create_time);
create index idx_log_par_201702_ctime on log_par_201701 using btree(create_time);
...
使用
插入连续数据
insert into log_par(user_id, create_time) select round(100*random()), generate_series('2017-01-01'::date, '2018-01-01'::date, '1 day');
select round 四舍五入函数
generate_series 生成连续数据
查看
select count(*) from log_par; 这种查询会查询到子表
select count(*) from only log_par; 只查询父表
\dt+ log_par* 查看各表大小
添加分区
接着分区范围,重复创建分区的第二和第三步骤
删除分区
drop table log_par_201701; 直接删除分区,数据也会一并删除
或
alter table log_par detach partition log_par_201701; 和父表解除绑定,保留数据,方便恢复
恢复
alter table log_par attach partition log_par_201701 for values from ('2017-01-01') to ('2017-02-01');

浙公网安备 33010602011771号