合理规划分布键,对表查询的性能至关重要,本文介绍分布键的选择策略。
选择数据分布均匀的列或者多个列
若分布键数据分布不均匀,可能会导致数据倾斜。数据倾斜会导致部分计算节点存储的数据过多,查询负载大,查询耗时变长。因此请不要选择bool类型、时间日期类型的列作为分布键。
选择经常需要JOIN的列作为分布键
可以实现本地关联(Collocated JOIN)计算(如图一所示),因为JOIN键和分布键一致时,可以在计算节点内部完成JOIN。否则需要将一个表进行重分布(Redistribute motion)来实现重分布关联(Redistributed Join)(如图二所示)或者广播其中小表(Broadcast motion)来实现广播关联(Broadcast Join)(如图三所示),重分布关联和广播关联两种方式都会产生较大的网络开销。
尽量选择高频率出现的查询条件列作为分布键
选择经常作为查询条件的列作为分布键,可以实现按分布键进行节点裁剪。如果建表时未指定分布键,则默认表的主键为分布键,如果表没有主键,则默认将第一列当做分布键。
您可以选择一个或多个列作为分布键,示例如下:
create table t1(c1 int, c2 int) distributed by (c1,c2);
谨慎选择随机分布DISTRIBUTED RANDOMLY
这将使得上述本地关联,或者节点裁剪不可能实现。