更新时间:2023-06-25 GMT+08:00

案例:选择合适的分布列

分布列用于将数据分布到不同的节点上,划分均衡可以避免数据倾斜。

在进行关联查询时,尽量选择查询中的关联条件作为分布键。当关联条件作为分布键时,相关数据都分布在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所示。

图1 选择合适的分布列案例(一)

优化后

将查询中的关联条件作为分布键,执行下列语句修改b作为t2的分布列:

1
ALTER TABLE t2 DISTRIBUTE BY HASH (b);

将表t2的分布列改为b列之后,执行计划将不再包含“Streaming(type: REDISTRIBUTE)”,减少了DN之间存在的通信数据量的同时,执行时间也从8.7毫秒降低至2.7毫秒,从而提升查询性能,如图2所示。

图2 选择合适的分布列案例(二)