1. Join Reorder
1.1 介绍
Join Reorder功能可以通过代价模型自动帮助调整SQL中Join的顺序,先让大表和小表进行过滤,这样能过滤掉大表中大部分的数据。以便获得最优的Join效率。可通过会话变量开启,默认是关闭的
mysql> show variables like '%enable_cost_based_join_reorder%';
+--------------------------------+-------+
| Variable_name | Value |
+--------------------------------+-------+
| enable_cost_based_join_reorder | false |
+--------------------------------+-------+
1 row in set (0.01 sec)
mysql>
mysql> set enable_cost_based_join_reorder=true;
Query OK, 0 rows affected (0.01 sec)
mysql>
可以通过explain graph
查看join的先后关系
1.2 Join Reorder逻辑
- 让大表、跟小表尽量做Join,它生成的中间结果是尽可能小的
- 把有条件的Join表往前放,也就是说尽量让有条件的Join表进行过滤
- Hash Join的优先级高于Nest Loop Join,因为Hash join本身是比Nest Loop Join快很多的
2. Doris Join调优原则
- 在做Join的时候,要尽量选择同类型或者简单类型的列,同类型的话就减少它的数据Cast,简单类型本身Join计算就很快
- 尽量选择Key列进行Join, 原因前面在Runtime Filter的时候也介绍了,Key列在延迟物化上能起到一个比较好的效果
- 大表之间的Join ,尽量让它Co-location ,因为大表之间的网络开销是很大的,如果需要去做Shuffle的话,代价是很高的
- 合理的使用Runtime Filter,它在Join过滤率高的场景下效果是非常显著的。但是它并不是万灵药,而是有一定副作用的,所以需要根据具体的SQL的粒度做开关
- 涉及到多表Join的时候,需要去判断Join的合理性。尽量保证左表为大表,右表为小表,然后Hash Join会优于Nest Loop Join。必要的时可以通过SQL Rewrite,利用Hint去调整Join的顺序