首页
首页
文章目录
  1. 简介
  2. range分区
  3. list分区
  4. hash分区
  5. 默认分区
  6. 其它

postgres11.2 创建分区表的方法

简介

整体思路
公司的接了一个可能会在未来改变中国的项目,我们的数据库用的是postgres,现在针对数据库业务,我们需要来做分区。简单查询了一下postgres有这几种方法,所以就写了一下用来做记录。

由于这个项目,所以才有我前面的俩篇postgres升级的方案

最后 我这边使用的postgres版本为11.2 连接工具为pgadmin4.2

range分区

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-- 主表创建
create table range_test(id int, date date)
partition by range ( date );
-- 字表创建
create table range_test_201902 partition of range_test(id primary key)
for values from ('2019-02-01') to ('2019-03-01');

create table range_test_201903 partition of range_test(id primary key)
for values from ('2019-03-01') to ('2019-04-01');

-- 插入测试数据
INSERT INTO range_test(id,date) VALUES (1,'2019-03-18');

-- 查看插入数据
select * from range_test;
select * from range_test_201903;

检查分区表是否创建成功
查看创建效果

插入一条数据检查效果
插入数据效果

list分区

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-- 主表创建
create table test_list(id int, city text)
partition by list( city );
-- 子表创建
create table test_list_jn partition of test_list(id primary key)
for values in ('济南');

create table test_list_hz partition of test_list(id primary key)
for values in ('杭州');

-- 插入测试数据
INSERT INTO test_list(id, city) VALUES (1,'杭州');

-- 查看插入数据
select * from test_list;
select * from test_list_hz;

检查分区表是否创建成功
查看创建效果

插入一条数据检查效果
插入数据效果

hash分区

这里说一句,hash算法在某些情况下可以使用list代替,比如partition by list (abs(mod(id,4)))

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
-- 主表创建
create table test_hash(id int, info text)
partition by hash (id);
-- 子表创建
create table test_hash0 partition of test_hash
for values WITH (MODULUS 4, REMAINDER 0);

create table test_hash1 partition of test_hash
for values WITH (MODULUS 4, REMAINDER 1);

create table test_hash2 partition of test_hash
for values WITH (MODULUS 4, REMAINDER 2);

create table test_hash3 partition of test_hash
for values WITH (MODULUS 4, REMAINDER 3);

-- 插入测试数据
INSERT INTO test_list(id, info) VALUES (1,'Dzer0');

-- 查看插入数据
select * from test_hash;
select * from test_hash0;

检查分区表是否创建成功
查看创建效果

插入一条数据检查效果
插入数据效果

默认分区

针对pg11 默认分区只支持list/range分区不支持hash分区

默认是分区主要是针对防止 list/range规则匹配不到的数据,默认写到该分区表中。

以上面range分区’range_test’举例

1
create table  range_test_default partition of range_test  default;

检查分区表是否创建成功
查看创建效果

插入不再range规则中的数据测试
插入不再range规则中的数据测试

其它

最后一个笔记:postgres一个主从集群里面的postgres.conf配置文件中有俩个参数对主从流复制很重要

1
synchronous_standby_names = '*'  # *=all

意思是所有slave都被允许以同步方式连接到master,但同一时间只能有一台slave是同步模式。另外可以指定slave,将值设置为slave的application_name即可。

1
synchronous_commit = on

这个参数控制是否等待wal日志buffer写入磁盘再返回用户事物状态信息。
这个对性能影响还是比较大的,看业务实际情况可考虑关闭,在关键数据更新时在事物中将其暂时性打开,保证关键数据不会因意外停机而丢失。
默认情况下是打开状态。同步流复制模式需要打开这个参数。注意如果slave节点挂掉 主节点将无法update数据会一致等待下去,需要将该参数修改为off后,pgctl reload后才能继续插入

以上

End!

支持一下
扫一扫,我会更有动力更新
  • 微信扫一扫
  • 支付宝扫一扫