分布键配置和查看
一、分布键设置规则:
greenplum的均匀分布式设置分布键来实现的,因此设置合理的分布键也就十分重要。
原则:
(1)一般使用数据比较均匀、空值很少的字段作为主键(主键是最适合做分布键的)) 如果在指定了分布键之后,主键不是分布键,那么系统会自动的修改主键为分布键。
(2)根据执行计划中的介绍,两个表关联时可能会造成数据广播或者重分布,所以选择分布键的时候要适当的考虑这个表和其他表常用的关联键,除此之外,group by、window function都会造成数据重分布。
(3)关联键于唯一键不一样的时候要有所取舍。
(4)如果表上定义了主键或者唯一键,则这些键值列必须作前导列出现在分布键当中。并且放在第一位
(5)如果定义表的时候,没有指定distributed子句,系统使用第一个列作为HASH键使用。
(6)另一种数据打散的算法是平均分配法(ROUND-ROBIN):
数据会被随机分不到segment上,相同记录可能会存放在不同的segment上。随机分布可以保证数据平均,但是Greenplum没有跨节点的唯一键约束数据,
所以无法保证数据唯一。基于唯一性和性能考虑,推荐使用hash分布,性能部分会另开一篇文档详细介绍。语法,distributed randomly。
(7)唯一性:hash分布键可以保证数据的唯一性,而随机分布键不能保证,(不能保证的原因是有多个实例的存在)。
二、分布键调整:
(1)查看数据库分布键
select n.nspname AS "模式名",c.relname AS "表名",case when p.policytype='p' then '分区表' when p.policytype='r' then '复制分布' end "分布策略", pg_get_table_distributedby(c.oid) "分布键" ,c.reloptions "压缩类型"
from pg_class c
left join gp_distribution_policy p on c.oid=p.localoid
left join pg_namespace n on c.relnamespace=n.oid
where c.relname in ('表名');
(2)查看表的数据分布情况
select gp_segment_id,count(*) from "表名" group by 1 ;
(3)确定分布键
根据分布键选择规则,设置合适的分布键
(4)调整表的分布键,对表数据进行重分布
ALTER TABLE "表名" SET WITH (REORGANIZE=TRUE) DISTRIBUTED BY (分布键名);
设置为随机分布:
ALTER TABLE "表名" SET WITH (REORGANIZE=TRUE) DISTRIBUTED randomly;
创建自增主键:
CREATE TABLE users
(
id SERIAL primary key ,
name character varying,
password character varying
);
或者增加字段:
修改分布键:
ALTER TABLE "表名" SET WITH (REORGANIZE=TRUE) DISTRIBUTED BY (分布键名);
ALTER TABLE "public"."test"
ADD COLUMN "id1" bigserial,
ADD PRIMARY KEY ("id1");
创建序列:
CREATE SEQUENCE users_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
设置主键自增:
alter table users alter column id set default nextval('users_id_seq');

浙公网安备 33010602011771号