Presto RBO之调整表的join顺序

一. 前言

       调整表的Join顺序是join操作性能优化的一个常见手段。一般SQL计算引擎都支持在Join计算的时候都能自动根据代价将小表调整到join的右侧,大表调整到join的左侧来进行计算从而获得良好的性能。本文通过走读代码来探索在Presto中是如何实现根据代价调整join计算时候的表顺序的。

二. 调整join的表顺序代码走读

      调整表的join顺序是在ReorderJoins优化器实现的,其实现步骤为:

joinEnumerator.chooseJoinOrder
   createJoinAccordingToPartitioning
       createJoin
          setJoinNodeProperties
             getPossibleJoinNodes   //此处会根据join的类型生成各种组合的Join操作子树,比如 A join B 会生成 A partitioned join B, A broadcast join B,B partitioned join A, B broadcast join A 4种组合
                resultComparator.min(possibleJoinNodes)   // 根据代价计算公式从上述所有组合中选择代价最小的执行计划执行。小表join大表的代价 大于 大表 join 小表的代价,因此优化后选择了大表 join 小表的计划执行树执行,从而实现join顺序调整优化 

三. 代价计算方式

      在Presto中,一个PlanNode的代价主要与CPUCost,memoryCost, networkCost有关,默认的计算公式为:

Cost = getCpuCost() * cpuWeight + getMaxMemory() * memoryWeight + getNetworkCost() * networkWeight;

其中,CPU,Memory,NetWork的默认权重分别为:75%,10%, 15%。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值