分布键配置和查看

一、分布键设置规则:

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');
posted @ 2025-06-26 16:58  数据库小白(专注)  阅读(95)  评论(0)    收藏  举报