Greenplum中所有的表都是必须分布存放的,这样可以充分利用MPP的并发特性。
在创建表时可以指定不同的分布策略,包括三种分布策略:HASH分布、随机分布和复制表。
HASH分布
概念:选择一个列或多个列作为数据表的分布键,通过hash计算,将插入的数据路由到特定的segment上。
HASH分布是默认的分布策略。也可通过指定DISTRIBUTED BY语法来指定使用HASH分布。
注:当建表时未定义分布键时,如果表有主键,使用主键字段作为默认的分布键;如果表上没有主键,默认按照第一个字段来分布。
示例:
=# create table dist1(a int, b text);
NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'a' as the Database data distribution key for this table.
HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.
CREATE TABLE
=# \d dist1
Table "public.dist1"
Column | Type | Modifiers
--------+---------+-----------
a | integer |
b | text |
Distributed by: (a)
=# create table dist1(a int, b text, primary key (b));
CREATE TABLE
=# \d dist1
Table "public.dist1"
Column | Type | Modifiers
--------+---------+-----------
a | integer |
b | text | not null
Indexes:
"dist1_pkey" PRIMARY KEY, btree (b)
Distributed by: (b)
随机分布
概念:数据随机分散在每一个节点中,可以保证数据平均分布,但是在执行 SQL 的过程中,关联等操作都需要将数据重分布,性能较差。
通过指定DISTRIBUTED RANDOMLY语法来指定使用随机分布。
注:如果表上有主键,不能创建为随机分布表。
示例:
=# create table dist1(a int, b text, primary key (a)) distributed randomly;
ERROR: PRIMARY KEY and DISTRIBUTED RANDOMLY are incompatible
=# create table dist1(a int, b text) distributed randomly;
CREATE TABLE
=# \d dist1
Table "public.dist1"
Column | Type | Modifiers
--------+---------+-----------
a | integer |
b | text |
Distributed randomly
注:如果想将默认的分布策略设置为随机分布,我们可以通过设置gp_create_table_random_default_distribution值为on来实现,默认值为off。
gpconfig --show gp_create_table_random_default_distribution
Values on all segments are consistent
GUC : gp_create_table_random_default_distribution
Master value: off
Segment value: off
复制表
概念:每一条记录都会分布到整个集群的所有Instance上,仅用于小表。
通过指定DISTRIBUTED REPLICATED语法来指定使用复制表。
示例:
=# create table dist1(a int, b text, primary key (a)) distributed replicated;
CREATE TABLE
qianbase=# \d dist1
Table "public.dist1"
Column | Type | Modifiers
--------+---------+-----------
a | integer | not null
b | text |
Indexes:
"dist1_pkey" PRIMARY KEY, btree (a)
Distributed Replicated