所有优化器的前提:不影响查询结果,即要保证优化前和优化后两个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是等价的。
从优化器的顺序上来看:
该优化器在谓词下推优化器之前执行