Postgres-XC:修改表的 Distribute 分布方式

Postgres-XC 里的表可以分为复制表和分片表,之前博客有介绍过,Postgres-XC : Data Replication Or Distribution ? 那么表的位置属性是否可以更改呢? 例如复制表是否可以修改成分片表? 在测试之前先来回顾下复制表和分片表。

关于复制表和分片表

创建复制表和分片表

1
2
3
4
5
6
7
8
9
10
11
复制表
francs=> create table test_rep(id1 int4, id2 int4, name text) distribute by replication;
CREATE TABLE

HASH 分片表
francs=> create table test_hash(id1 int4, id2 int4, name text) distribute by hash(id2);
CREATE TABLE

modulo 分片表
francs=> create table test_modulo(id1 int4, id2 int4, name text) distribute by modulo(id1);
CREATE TABLE

备注:如何查看表是复制表和分片表呢?有两种方式。

方式一:\d+ 元子命令

1
2
3
4
5
6
7
8
9
10
francs=> \d+ test_rep
Table "francs.test_rep"
Column | Type | Modifiers | Storage | Stats target | Description
--------+---------+-----------+----------+--------------+-------------
id1 | integer | | plain| |
id2 | integer | | plain| |
name | text| | extended | |
Has OIDs: no
Distribute By: REPLICATION
Location Nodes: ALL DATANODES

备注:查看 Distribute By 属性,可以看到 test_rep 为复制表。

方式二:查看 pgxc_class 系统表

备注:pgxc_class 系统表存储的是 pgxc 表的位置信息,为 Postgres-XC 新增,主要字段含义如下:

  • pcrelid: pgxc: 表的 OID
  • pclocatortype: 表的属性,R 表示复制表,H 表示 hash 分片,M 表示 modulo 分片
  • pcattnum: 表的分片字段位置
  • pchashalgorithm:是否使用 hash 分片算法
  • nodeoids: 数据结点列表

修改表的分片方式

创建一张复制表 test_rep2 并插入测试数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
francs=> create table test_rep2(id1 int4, id2 int4, name text) distribute by replication;
CREATE TABLE

francs=> insert into test_rep2(id1,name) select n, n|| 'a' from generate_series(1,100) n;
INSERT 0 100

francs=> select pcrelid::regclass, * from pgxc_class where pcrelid::regclass ='test_rep2'::regclass;
-[ RECORD 1 ]---+------------
pcrelid | test_rep2
pcrelid | 26561
pclocatortype | R
pcattnum | 0
pchashalgorithm | 0
pchashbuckets | 0
nodeoids | 16388 16389

修改复制表 test_rep2 Distribute 属性

1
2
3
4
5
6
7
8
9
10
11
12
francs=> alter table test_rep2 distribute by hash(id1);
ALTER TABLE

francs=> select pcrelid::regclass, * from pgxc_class where pcrelid::regclass ='test_rep2'::regclass;
-[ RECORD 1 ]---+------------
pcrelid | test_rep2
pcrelid | 26561
pclocatortype | H
pcattnum | 1
pchashalgorithm | 1
pchashbuckets | 4096
nodeoids | 16388 16389

备注:可见 test_rep2 表成功地修改成了 hash 分片表,有一点需要注意,修改表的分片方式意味影着表的数据重新分布,如果是大表将非常耗时,且影响表上的 DML 操作。

参考

最后推荐和张文升共同编写的《PostgreSQL实战》,本书基于PostgreSQL 10 编写,共18章,重点介绍SQL高级特性、并行查询、分区表、物理复制、逻辑复制、备份恢复、高可用、性能优化、PostGIS等,涵盖大量实战用例!

购买链接:https://item.jd.com/12405774.html

PostgreSQL实战
感谢支持!
0%