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

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

若选择的分布列数值分布不均匀,则可能导致数据倾斜。某些Segment节点存储数据多(查询负载高)。根据木桶原理,时间消耗会卡在数据多的节点上。故不应选择bool类型,时间日期类型数据作为分布键。

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

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

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

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

从而可能实现按分布键做节点Segment的裁剪。若未指定分布键,默认表的主键为分布键,若表没有主键,则默认将第一列当做分布键。

分布键可以被定义为一个或多个列,示例如下:

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

谨慎选择随机分布DISTRIBUTED RANDOMLY

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