在greenplum 数据库中,一般正常的表的数据都是存在segment 实例中的,master上并没有数据;但是也有一些特殊的系统表,例如gp_id, 在master上也有数据,每个segment 上也有自己的数据;
如果执行select * from gp_id; 查询出来的只是master 上的数据。
例如:
testdb1=# select gp_segment_id,* from gp_id; gp_segment_id | gpname | numsegments | dbid | content ---------------+-----------+-------------+------+--------- -1 | Greenplum | -1 | -1 | -1 (1 row)
如果要查询segment 上的数据,就需要使用函数 gp_dist_random,例如:
testdb1=# select gp_segment_id,* from gp_dist_random('gp_id'); gp_segment_id | gpname | numsegments | dbid | content ---------------+-----------+-------------+------+--------- 0 | Greenplum | -1 | -1 | -1 1 | Greenplum | -1 | -1 | -1 (2 rows)
如果我们要创建自己的表,并且把数据存储在master上,该如何实现呢? 很简单:
1. 按正常create table 语法创建表;
2.修改元数据表 gp_distribution_policy ,把该表的分布键记录删除;
set allow_system_table_mods=dml; delete from gp_distribution_policy where localoid='tablename'::regclass;
这样创建出来的表,就是master only表了;