两个表进行join时,让右表根据左边的数据分布,进行数据的shuffle,再进行join。减少跨节点的数据传输。加速查询

SQL语句为A表join B表,并且join的等值表达式命中了A的数据分布列。而Bucket
Shuffle Join会根据A表的数据分布信息,将B表的数据发送到对应的A表的数据存储节点。Bucket Shuffle Join的网络开销和内存开销都是B
对于表的数据分布没有强制性的要求,不容易导致数据倾斜的问题
设置session变量。该变量默认是开启的。开启后是否命中Bucket Shuffle Join对用户来说是透明的
mysql> show variables like '%bucket_shuffle_join%';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| enable_bucket_shuffle_join | true |
+----------------------------+-------+
1 row in set (0.02 sec)
mysql>
在FE进行分布式查询规划时,优先选择的顺序为Colocate Join -> Bucket Shuffle Join -> Broadcast Join -> Shuffle Join。但是如果用户显式hint了Join的类型,则上述的选择优先顺序则不生效。如:
mysql> select * from click a join [shuffle] user_live b on a.user_id = b.user_id and a.city = b.city;
提升命中Bucket Shuffle Join的条件
查看查询语句的执行计划
mysql> explain select * from click a join user_live b on a.user_id = b.user_id and a.city = b.city;
+------------------------------------------------------------------------------------------------------------------------------+
| Explain String |
+------------------------------------------------------------------------------------------------------------------------------+
......省略部分......
| 2:VHASH JOIN |
| | join op: INNER JOIN(BUCKET_SHUFFLE)[Tables are not in the same group] |
| | equal join conjunct: `a`.`user_id` = `b`.`user_id` |
| | equal join conjunct: `a`.`city` = `b`.`city` |
| | runtime filters: RF000[in_or_bloom] <- `b`.`user_id`, RF001[in_or_bloom] <- `b`.`city` |
| | cardinality=0 |
| | vec output tuple id: 2 | |
| |----3:VEXCHANGE |
| | |
| 0:VOlapScanNode |
......省略部分......
34 rows in set (0.01 sec)
mysql>
join op的join为BUCKET_SHUFFLE,表示使用的是Bucket Shuffle Join