产品概述
应用场景
节点规格
集群架构
CREATE TABLE <table_name> (...) [ DISTRIBUTED BY (<column> [,..] ) | DISTRIBUTED RANDOMLY | DISTRIBUTED REPLICATED ]
CREATE TABLE支持如下三个分布策略的子句:DISTRIBUTED BY (column, [ ... ])指定数据按分布列的哈希值在节点(Segment)间分布,根据分布列哈希值将每一行分配给特定节点(Segment)。相同的值将始终散列到同一个节点。选择唯一的分布键(例如 Primary Key)将确保较均匀的数据分布。哈希分布是表的默认分布策略, 如果创建表时未提供 DISTRIBUTED 子句,则将 PRIMARY KEY 或表的第一个合格列用作分布键。如果表中没有合格的列,则退化为随机分布策略。DISTRIBUTED RANDOMLY指定数据按循环的方式均匀分配在各节点 (Segment) 间,与哈希分布策略不同,具有相同值的数据行不一定位于同一个 segment 上。虽然随机分布确保了数据的平均分布,但只建议当表没有合适的离散分布的数据列作为哈希分布列时采用随机分布策略。DISTRIBUTED REPLICATED 指定数据为复制分布,即每个节点(Segment)上有该表的全量数据,这种分布策略下表数据将均匀分布,因为每个 segment 都存储着同样的数据行,当有大表与小表join,把足够小的表指定为 replicated 也可能提升性能。

CREATE TABLE products (name varchar(40),prod_id integer,supplier_id integer)DISTRIBUTED BY (prod_id);
CREATE TABLE random_stuff (things text,doodads text,etc text)DISTRIBUTED RANDOMLY;
CREATE TABLE replicated_stuff (things text,doodads text,etc text)DISTRIBUTED REPLICATED;
select * from products where prod_id = 101;
create table t1(c1 int, c2 int) distributed by (c1,c2);

create table t1(c1 int, c2 int, primary key (c1)) distributed by (c2);会创建失败
create table t1(c1 int, c2 int) distributed by (c1);select gp_segment_id,count(1) from t1 group by 1 order by 2 desc;gp_segment_id | count---------------+--------0 | 10001 | 68(2 rows)
ALTER TABLE <table_name> SET WITH (REORGANIZE=true)DISTRIBUTED BY (<distribution columns>);
文档反馈