这是我参与「第四届青训营 」笔记创作活动的第1天
首先很高兴有机会参与到字节的青训营,这是一篇关于查询优化器RBO的文章。
RBO (Rule-based Optimizer)
首先RBO:根据关系代数等价语义,重写查询 ; 基于启发式规则 ; 会访问表的元信息 (catalog),不会涉及具体的表数据(data)
几种优化方式
列裁剪
在列裁剪中在先根据上方算子需要哪些列,在SCAN时候就只读取需要的列,这与就可以减少读取时间,进行优化。例如下方图片中,就是根据上方算子发现只需要sield,userld,id,sield,name这几列
谓词下推
谓词下推就是把Filterh中查询进行下推,这样在JOIN就只需要连接满足Filter中的就可以了,这样就减少后续算子执行的时间。这下面图片例子中就是把filter中的 user.siteld > 123 进行下推先进行filter后在进行JOIN连接,以此来达到减少后续执行时间的目的。
传递闭包
传递闭包我们直接看下面的例子,在左边JOIN中 pv.siteld = user.siteld , 在filter 中有选择条件 user.siteld > 123,那么JOIN后 pv.siteld 也是大于 123 所以我们不妨在SCAN读表后就进行选择这样就是减少读取列。
runtime filter
runtime filter比较特殊是在运行时实现的,首先就是我们在右边filter之后我们得到了选择后的列,在根据JOIN中的条件我们就可以得到数据的范围信息,然后在运行时传到左边形成一个固定的filter。
到此我也发现了这些知识与几个例子在数据库系统概论中也都有一些相同的理论。最后这是我第一次做笔记也是第一次在青训营进行学习,我也希望在此与大家共同交流,和小组成员做出优秀的项目。