在 实战 PostgreSQL 分区表 中并没有涉及到如何修改分区表的问题。这篇内容将聚焦如何进行分区表的修改。
我们使用上一篇 实战 PostgreSQL 分区表 中的 Order 数据的场景,关于如何初始化这部分数据,请参考 实战 PostgreSQL 分区表。
00,场景
1,拆分分区
2,合并分区
01,拆分分区:操作流程
(1),确认分区规则
原来的分区情况如下:父表 orders 下有 5个分区。
目标:我们把 orders_history 拆分为 orders_202002、orders_history 两个分区。
(2),解绑要进行拆分的分区
ALTER TABLE orders DETACH PARTITION orders_history;
解绑完成之后,可以看到 orders_history 不再是 orders 的分区表。
(3),创建"二级"分区
实际就是创建创建一个父表和这个父表的两个分区表。我们要实现的效果如下图
通过 3 步创建分区表。
# 创建父表
CREATE TABLE orders_history_subs ( id serial, user_id int4, create_time timestamp(0)) PARTITION BY RANGE(create_time);
# 创建分区表
CREATE TABLE orders_202002 PARTITION OF orders_history_subs FOR VALUES FROM ('2020-02-01') TO ('2020-03-01');
1. 1. 1. s
CREATE TABLE orders_history_before_202002 PARTITION OF orders_history_subs FOR VALUES FROM ('2000-01-01') TO ('2020-02-01');
# 创建索引
CREATE INDEX order_idx_history_202002_create_time ON orders_202002 USING btree(create_time);
CREATE INDEX order_idx_history_before_202002_create_time ON orders_history_before_202002 USING btree(create_time);
(4),绑定“二级"分区到父表上
ALTER TABLE orders ATTACH PARTITION orders_history_subs FOR VALUES FROM ('2000-01-01') TO ('2020-03-01');
原有的 orders 分区表成了下图结构:
(5),迁移旧数据
将原 orders_history 表中数据迁移过来
INSERT INTO orders_history_subs select * from orders_history;
02,合并分区:操作流程
与拆分的流程类似。
03,应用
使用合并分区、拆分分区我们能够灵活的控制热点数据的数据量。
如果团队中使用 Flyway 这样的数据库版本控制工具就能够通过控制数据库版本来动态实现数据的迁移。