列裁剪
对于没用到的列,则没有必要读取它们的数据去浪费无谓的IO
比如我们有一张表table1,它含有四列数据(a,b,c,d)。当我们执行查询select a from table1 where c 10时,我们可以清晰的看到,table1中只有a,c两列被用到了。分别是Selection算子用到c列和Projection算子用到a列。那么DataSource读取数据时,b,d两列则不需要读取,可以裁剪掉。
那么都有哪些算子与列有关系呢?综合我们多年来使用SQL的经验来看,Selection(Where 条件)、Projection(搜索的列)、Sort(排序列)、Join(等值连接)、Aggregation(Group By及相关聚合操作)等。
列裁剪的算法就是自顶向下的把算子过一遍,某个节点需要用到的列就等于它自己需要用到的列加上它的父节点所需要用到的列。这样得到整个SQL语句所涉及到的列,从而再读取数据时只读取需要的列即可。
列裁剪通过只读取需要的数据减少IO操作来达到优化的目的
投影消除
投影消除是把不必要的Projection给消除掉
那么问题来了,什么情况下,投影算子是可以被消除的呢?
如何Projection算子需要投影的列跟子节点的输出列一样,那么这个投影就是一个废操作,可以被消除掉。比如说:select a,b from table1 如果再表table1中刚好只有a,b两列,也就是DataSource的输出和Projection需要投影的列一样,那么这时候就没必要在TableScan之后再做一次Projection操作了。
如果Projection的子节点还是Projection的话&#x