按照 Greenplum官方安装教程 一步一步来即可。
hostnamectl set-hostname mdw
reboot
vim /etc/hosts
末尾追加 本机ip mdw sdw
本机ip别写127.0.0.1
vim ~/greenplum/all_hosts
下面加两行
mdw
sdw
在gpssh-exkeys -h localhost
这一步,显示无法连接本地 ssh。
解决这个问题方法就是配一下 ssh 公钥登录,参考 ssh公钥登录配置。
在官方教程里面有一步需要自己新建一个 MACHINE_LIST_FILE
文件,并将本机的 hostname 放进去。
同时要将MASTER_HOSTNAME
改为本机的 hostname 。
部署在一台4核古董机上,拥有高达4GB的内存和1T的HDD。
1个master和3个segment,没有standby。
gpinitsystem -c gpinitsystem_singlenode
建两张表,一大一小,大的约为30GB(5亿条数据),小的3GB(5千万条)。
两张表结构相同,均以 id 作为分布键,info和val为1,100范围内的随机数。
对应SQL如下
create table tbl_test (id int, info int, val int) distributed by (id);
create table tbl_small (id int, info int, val int) distributed by (id);
insert into tbl_test select generate_series(1,500000000),(random()*100)::int,(random()*100)::int from generate_series(1,1);
insert into tbl_small select generate_series(1,50000000),(random()*100)::int,(random()*100)::int from generate_series(1,1);
建完表格后,可以查询对应表所占的物理空间和数据在各个segment上的分布情况
select gp_segment_id, count(*) from tbl_test group by gp_segment_id;
select gp_segment_id, count(*) from tbl_small group by gp_segment_id;
--查看表存储空间
select pg_size_pretty(pg_relation_size('tbl_test'));
select pg_size_pretty(pg_relation_size('tbl_small'));
其数据在segment的分布结果如下图所示
每个表所占用的存储空间如下图所示
以分布键作为过滤条件。
SELECT tbl_test.val,tbl_small.val
FROM tbl_test
INNER JOIN tbl_small
ON tbl_test.id = tbl_small.id WHERE tbl_test.info < 5;
非分布键作为过滤条件。
SELECT tbl_test.id,tbl_small.id
from tbl_test
inner join tbl_small
on tbl_test.val = tbl_small.val where tbl_test.info < 5;
表的列属性与之前一样,这次按info值3等分分区
create table tbl_distribute (id int, info int, val int)
DISTRIBUTED BY (id)
PARTITION BY RANGE(info)
(
partition p1 start ('0') inclusive end ('33') exclusive,
partition p2 start ('33') inclusive end ('66') exclusive,
partition p3 start ('66') inclusive end ('100') exclusive,
default partition default_p
);
插入数据也和之前类似,往主表里插入5亿条数据库
insert into tbl_distribute select generate_series(1,500000000),(random()*100)::int,(random()*100)::int from generate_series(1,1);
查询 info<50 的元组,在做了分区表之后,其查询计划如下图所示
EXPLAIN SELECT id,val
FROM tbl_distribute
WHERE info < 50;
SELECT tbl_distribute.id,tbl_small.id
from tbl_distribute
inner join tbl_small
on tbl_distribute.val = tbl_small.val where tbl_distribute.info < 5;
同样是查询 info<50 的元组,其查询计划如下图所示
EXPLAIN SELECT id,val
FROM tbl_test
WHERE info < 10;
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。