AnalyticDB PostgreSQL 支持三种数据在节点间的分布方式,即按指定列的哈希(HASH)分布、随机(RANDOMLY)分布、复制(REPLICATED)分布。

数据分布策略

语法

CREATE TABLE table_name (...) [ DISTRIBUTED BY (column  [,..] ) | DISTRIBUTED RANDOMLY | DISTRIBUTED REPLICATED ]
说明 ADB PG 4.3版本只支持哈希(HASH)分布和随机(RANDOMLY)分布,复制(REPLICATED)分布为 6.0 版本新增加特性。

哈希分布

DISTRIBUTED BY (column, [ ... ])

指定数据按分布列的哈希值在节点(Segment)间分布,根据分布列哈希值将每一行分配给特定节点(Segment)。相同的值将始终散列到同一个节点。选择唯一的分布键(例如Primary Key)将确保较均匀的数据分布。哈希分布是表的默认分布策略, 如果创建表时未提供DISTRIBUTED子句,则将PRIMARY KEY或表的第一个合格列用作分布键。如果表中没有合格的列,则退化为随机分布策略。

建表语句示例如下:

CREATE TABLE products 
(name varchar(40),                   
 prod_id integer,                   
 supplier_id integer) DISTRIBUTED BY (prod_id);   

创建了一个哈希(Hash)分布的表,数据将按分布键的哈希值被分配到对应的节点上。

随机分布

DISTRIBUTED RANDOMLY

指定数据按循环的方式均匀分配在各节点 (Segment) 间,与哈希分布策略不同,具有相同值的数据行不一定位于同一个节点上。虽然随机分布确保了数据的平均分布,但只建议当表没有合适的离散分布的数据列作为哈希分布列时采用随机分布策略。

建表语句示例如下:

CREATE TABLE random_stuff (things text,
                           doodads text,
                           etc text)  DISTRIBUTED RANDOMLY;

创建了一个随机(Randomly)分布的表,数据被循环着放置到各个Segment数据节点上。 当表没有合适的离散分布的数据列作为哈希分布列时,可以采用随机分布策略。

复制分布

DISTRIBUTED REPLICATED

指定数据为复制分布,即每个节点(Segment)上有该表的全量数据,这种分布策略下表数据将均匀分布,因为每个节点都存储着同样的数据行,当有大表与小表JOIN,把足够小的表指定为replicated也可能提升性能。

建表语句示例如下:

CREATE TABLE replicated_stuff (things text,
                               doodads text,
                               etc text) DISTRIBUTED REPLICATED;

创建了一个复制(Replicated)分布的表,每个 Segment 数据节点都存储有一个全量的表数据。