安装教程
按照 Greenplum官方安装教程 一步一步来即可。
缺少的步骤
主机名修改
hostnamectl set-hostname mdw
reboot
配置 /etc/host
vim /etc/hosts
末尾追加 本机ip mdw sdw
本机ip别写127.0.0.1
打通服务器间连接
vim ~/greenplum/all_hosts
下面加两行
mdw
sdw
遇到的问题
gpssh 报错
在gpssh-exkeys -h localhost
这一步,显示无法连接本地 ssh。
解决这个问题方法就是配一下 ssh 公钥登录,参考 ssh公钥登录配置。
hostname报错
在官方教程里面有一步需要自己新建一个 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;
我们构造一个更加复杂的SELECT语句,要求其使用聚合函数,这时候查询计划就会创建出 Redistributed Motion
。
分区表查询
建立分区表
表的列属性与之前一样,这次按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;