Apache Doris性能优化之Join Reorder和Doris Join调优原则

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的顺序

猜你喜欢

转载自blog.csdn.net/yy8623977/article/details/126177005