山大软工实践hive(11)-ConstantPropagate优化器的流程

2021SC@SDUSC

山大软工实践hive(11)-ConstantPropagate优化器的流程

目的

看懂如何执行对应的优化

过程

看ConstantPropagate类,对应常量折叠,百度翻译它的功能(后面解析要用)
在这里插入图片描述
其中udf为hive用户自定义函数

transform方法,一开始
在这里插入图片描述
pactx为传入的参数

然后放了8个规则
在这里插入图片描述
接下来
在这里插入图片描述
ConstantPropagateWalker是该优化器的内部类
在这里插入图片描述
总结一下,就是一个节点的所有父节点要先于该节点被dispatch
但是ForwardWalker的walk也是让父节点先被dispatch,这两个有什么区别?看了半天没感觉有什么区别

然后就是dispatch,从8个规则中找到minCost,然后获取对应的NodeProcessor,进行process方法。注意,当rule为null时,会用defaultprocess,之前看的优化器的这个为null,但这个优化器是传了一个ConstantPropagatepProcFAactory.getDefaultProc()
(下图第一,三个参数在上一个优化器传的null)
.在这里插入图片描述
然后就是就选中的规则process,先去看优化where语句的 ConstantPropagateProcFactory.getFilterProc()的process方法
这个类的注释大概就是说用于处理Filter算子里的常量表达式,其他的规则估计也是类似:处理对应算子的场两个表达式
在这里插入图片描述

看看它的process方法的前面一部分,看荧光标记的那一行
在这里插入图片描述
注释第一句是从父节点们获得传播常量,这应该对应该优化器的第三种功能。
其它部分注释的翻译:
在这里插入图片描述
总之就是确认 列=常量 的表达式并添加到map返回。这个行解析器是什么?
方法主体就不看了,人看麻
然后process方法里下一句就是把这个算子的常量内容存在pctx里

下一部分
在这里插入图片描述

首先是获得op原本的predicate,根据上个优化器的内容,如果修改会把predicate设置为新的,反之就用原本的。
看划黄线的部分,常量折叠
传入参数分别是,旧predicate,clomuns=常量的map,pctx,算子本身,tag=0,传播=true
在这里插入图片描述
进行的是折叠输入的表达式。
其中有一部判断一个选项是SUORTCUT还是FULL
如果是shortCut,就只会执行第二个功能:逻辑表达式的优化,去除不必要的or操作
在这里插入图片描述
反之则执行所有的三种优化(注释还举了点例子)
在这里插入图片描述
它们返回的是对旧predicate处理后的结果,之后就是看这个newCondn是否可以被保存,最后让op记录这个newCondn,这一方面也和上个优化器相似
值得一提的是,它会把满足特定条件的op添加到opToDelete,这在transform的后面部分有用
在这里插入图片描述
剩下的就和上个优化器一样
接着看主方法的剩下部分
在这里插入图片描述
看意思是它会把optoDelete里除了只有一个父节点的节点删除,并且把他们的子节点给其它节点“收养”

最后

不要试图看懂如何执行对应的优化

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值