案例:选择合适的分布列
分布列用于将数据分布到不同的节点上,划分均衡可以避免数据倾斜。
在进行关联查询时,尽量选择查询中的关联条件作为分布键。当关联条件作为分布键时,相关数据都分布在DN本地,将减少DN之间的数据流动代价,提升查询速度。
优化前
将a作为t1和t2的分布列,表定义如下:
1 2 |
CREATE TABLE t1 (a int, b int) DISTRIBUTE BY HASH (a); CREATE TABLE t2 (a int, b int) DISTRIBUTE BY HASH (a); |
执行如下查询:
1
|
SELECT * FROM t1, t2 WHERE t1.a = t2.b; |
则执行计划存在“Streaming(type: REDISTRIBUTE)”,即DN根据选定的列把数据重分布到所有的DN,这将导致DN之间存在较大通信数据量,如图1所示。
优化后
将查询中的关联条件作为分布键,执行下列语句修改b作为t2的分布列:
1
|
ALTER TABLE t2 DISTRIBUTE BY HASH (b); |
将表t2的分布列改为b列之后,执行计划将不再包含“Streaming(type: REDISTRIBUTE)”,减少了DN之间存在的通信数据量的同时,执行时间也从8.7毫秒降低至2.7毫秒,从而提升查询性能,如图2所示。