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 操作。
参考
原创文章,作者:carmelaweatherly,如若转载,请注明出处:https://blog.ytso.com/240097.html