• 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> 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    可以通过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的顺序
  • 相关阅读:
    前端构建工具(webpack&vite)
    2024高频前端面试题(含答案)(1)
    【Python零基础入门篇 · 6】:Python中的注释、字符串的常见操作、对象的布尔值
    日期相关工具类
    Hbase的SQL接口之Phoenix使用心得
    Linux起源
    Python全栈开发【基础-09】深浅拷贝+while循环
    Pipeline知识小记
    利用Python给女朋友跨年放个烟花
    [原创]解决老款AMD CPU在Win10/Win11无故重启的问题.
  • 原文地址:https://blog.csdn.net/yy8623977/article/details/126177005