Spark sql逻辑执行计划优化器——EliminateOuterJoin【消除outerjoin】

2021-11-17 15:19:53 浏览数 (1)

所有优化器的前提:不影响查询结果,即要保证优化前和优化后两个sql执行的效果相同

EliminateOuterJoin的主要作用是消除外连接(left,right,full),比如把left join、right join 转为inner join,full join转为left join、right join or inner join 。

为啥要消除外链接呢?

能在一定程度上提高效率:

inner join 只保留左表和右表可以关联到的数据,left join 需要保留左表全表的数据,right join 需要保留右表全表的数据,full join左右表数据都需要保留,这四种join在数据处理上的效率:inner join>left/right join >full join 。

如果将一些和内连接逻辑等价的外连接转化为内连接,可以提前过滤很多不需要的记录,加速整个数据处理的过程。

EliminateOuterJoin优化器主要处理的是Filter的子节点为Join节点的情况

代码核心流程

为啥可以做这样的转化呢?

以【left outer类型,且右表有过滤条件,则left outer-->inner】为例

——left join 的特点是右表没有对应的数据时补null,现在右表有个条件a<1,这说明右表为null都会被a<1给过滤掉,此时和inner join是等价的。

从优化器的顺序上来看:

该优化器在谓词下推优化器之前执行

0 人点赞