南大通用GBase 8a性能优化案例,大量小表join时拉了复制表导致只有1个节点运行,gcluster_hash_redistribute_join_optimize 参数调整

在某个项目里,有接近20个表参与left join,但每个表命中的数据量都很少,不超过6万行。在运行中,发现最耗时的阶段只有1个节点在运行,且产生了大量的临时中间文件。查看执行日志确认所有数据表都别拉成了复制表,最后在1个节点上运行。通过调整gcluster_hash_redistribute_join_optimize参数,强行将主表,虽然数据量也不多,拉成分布表,性能有1倍以上的提升。预计节点越多,性能提升越多。

参考

参数

gcluster_hash_redistribute_join_optimize

含义

是否启用Hash重分布的JOIN模式。默认值是2。
参数=0拉复制表

参数=1一直使用。在两个分布表进行等值JOIN运算时,
将把其中一个表的数据根据连接条件列的值进行哈希重分布。
然后,利用各个运算节点上重分布后的临时表和另一个进行JOIN运算。
这样,各节点的运算结果直接汇总即可得到最终结果。
这种策略可以免于将其中一个分布表在所有运算节点上拉成复制表,而是每个运算节点只需接收这个表的一部分数据。

参数=2由规则决定:两表的尺寸相差不超过20%时,使用哈希重分布JOIN;否则不使用。

说明

由于数据量很少,且很接近,最终执行计划是将表都拉成了复制表,导致在逐级join后在单个节点产生了大量的临时中间文件。

通过调整参数为1,将主表拉成了分布表,最终所有计算节点全部能参与运算,提升了性能。

辅助参数

参数1

gcluster_hash_redist_threshold_row

说明1

当该值不为 0 时,若小表拉表的数据行数大于该值,进行 HASH 重分布 JOIN。
该参数的默认值是 0。

该参数配合gcluster_hash_redistribute_join_optimize的参数值2使用。

样例

小于参数走复制表

如果大于参数值,则走重分布

参数2

gcluster_hash_redistribute_join_optimize

说明2

是否启用Hash重分布的JOIN模式。默认值是1。
参数=0禁用。
参数=1一直使用。在两个分布表进行等值JOIN运算时,将把其中一个表的数据根据连接条件列的值进行哈希重分布。
然后,利用各个运算节点上重分布后的临时表和另一个进行JOIN运算。这样,各节点的运算结果直接汇总即可得到最终结果。
这种策略可以免于将其中一个分布表在所有运算节点上拉成复制表,而是每个运算节点只需接收这个表的一部分数据。
参数=2由规则决定:两表的尺寸相差不超过20%时,使用哈希重分布JOIN;否则不使用。

参数3

gcluster_hash_redistribute_groupby_optimize

说明3

这个参数用于控制是否启用Hash重分布的GROUP BY模式。
参数=0禁用。
参数=1启用。进行分组(groupby)运算之前,将会把临时结果利用哈希算法重分布到各个运算节点,再由各个节点进行分组运算。由于数据在分到各个节点之前已经做了哈希,因此产生的结果直接汇总即可得到最终结果,不再需要由汇总节点再做一次分组。
该参数的默认值是1。
需要说明的是:当查询包含OLAP函数、ORDERBY、LIMIT时,无法使用本参数进行优化。

参数影响执行计划方式

join场景gcluster_hash_redistribute_join_optimize 参数1gcluster_hash_redist_threshold_row 参数2执行计划
两表均为分布表, join条件为两表hash分布列 2或1无影响直接本地进行join运算 走静态hash join执行计划,
一表为分布表,一表为复制表无影响无影响直接本地进行join运算 走分布表join复制表执行计划
两表均为分布表 join条件为其中一表hash分布列=2 根据参数2判断执行计划
=1 走执行计划1)
=0 走执行计划2)
参数1= 2,根据参数2的数值评估,如下:
IF 小表条数 < gcluster_hash_redist_threshold_row and 大表和小表的条数差距超过20%
Then 走执行计划2
Else 走执行计划1
END
1)将非join列hash分布表按照join条件列动态重分布,走动态重分布hash join执行计划1
2)将较小的表拉成复制表,走拉复制表执行计划
两表为分布表, join条件非两表任意一表hash分布列=2 根据参数2判断执行计划 =1 走执行计划1) =0 走执行计划2)如参数1 = 2,根据参数2的数值评估,如下:
IF 小表条数 < gcluster_hash_redist_threshold_row and 大表和小表的条数差距超过20%
Then 走执行计划2
Else 走执行计划1
END
1)将两个非join列hash分布表按照join条件列分别动态重分布,走动态重分布hash join
2)将较小的表拉成复制表,走拉小表拉复制表执行计划