合理规划分布键,对表查询的性能至关重要,本文介绍分布键的选择策略。

选择数据分布均匀的列或者多个列

若分布键数据分布不均匀,可能会导致数据倾斜。数据倾斜会导致部分计算节点存储的数据过多,查询负载大,查询耗时变长。因此请不要选择bool类型、时间日期类型的列作为分布键。

选择经常需要JOIN的列作为分布键

可以实现本地关联(Collocated JOIN)计算(如图一所示),因为JOIN键和分布键一致时,可以在计算节点内部完成JOIN。否则需要将一个表进行重分布(Redistribute motion)来实现重分布关联(Redistributed Join)(如图二所示)或者广播其中小表(Broadcast motion)来实现广播关联(Broadcast Join)(如图三所示),重分布关联和广播关联两种方式都会产生较大的网络开销。

图 1. 本地关联
本地关联
图 2. 重分布关联
重分布关联
图 3. 广播关联
广播关联

尽量选择高频率出现的查询条件列作为分布键

选择经常作为查询条件的列作为分布键,可以实现按分布键进行节点裁剪。如果建表时未指定分布键,则默认表的主键为分布键,如果表没有主键,则默认将第一列当做分布键。

您可以选择一个或多个列作为分布键,示例如下:

create table t1(c1 int, c2 int) distributed by (c1,c2);

谨慎选择随机分布DISTRIBUTED RANDOMLY

这将使得上述本地关联,或者节点裁剪不可能实现。