cascade优化器是volcano的后续版本,进行了一些优化。他们的主要思想都是通过规则枚举出所有的plan case,然后通过cost model 选出最优的plan。主要的不同点在于volcano是先等价替换出所有的逻辑计划,然后计算物理计划。而cascade是没有区分逻辑计划和物理计划,统一处理。个人认为volcano类似于宽度优先搜索,cascade类似于深度优先搜索



  • cascade首发于论文:G. Graefe, The Cascades Framework for Query Optimization, in IEEE Data Engineering Bulletin, 1995


  • cascade是一个framework,那个年代是面向对象思想的黄金年代。Columbia(一篇硕士论文)对其补充了很多细节:Yongwen Xu, Efficiency in the Columbia Database Query Optimizer (pages 1-35), in Portland State University, 1998


术语


  • expression:sql对应的执行计划。

  • group:cascade对于处理结果相同的表达式,归类为一个group。n个表进行join,会有2^n个group出现。这和system r的那张表类似。每个group其实 就是要求解问题的子问题。

  • logical operator、physical operator:逻辑算子和物理算子

  • group tree:由group最为子节点的tree,group tree的root节点一般是operator。

  • MEMO:cascade通过memo数据结构存放group的枚举遍历结果。

  • 规则:规则一般是对于group tree进行等价替换,替换过程中,可能会扩大搜索范围


主要思想


初始搜索空间

用户sql经过重写后,会转换成内部的logical operator tree,初始时会将其转换成group tree,如下把五个算子转换成5个group,其root节点group则是我们要计算的最优解。

Cascade优化器_java


group

每个group内的表达式可以进行等价替换,枚举出很多等价的plan case,如下图

Cascade优化器_java_02


Cascade优化器_java_03

rule

rule是对group tree的一个等价替换规则系统,主要是把逻辑算子替换成另一个逻辑算子或者物理算子。是一种模式匹配的方式。如下:

Cascade优化器_java_04


Memo

memo是对搜索过程中,遍历到的group的状态存储用的。


初始的momo如下图:

Cascade优化器_java_05

进行规则替换后,memo增长如下图:

Cascade优化器_java_06



memo其实就是group tree组成的森林。


cascade的遍历过程,和volcano的递归方式很类似。可以用task栈模拟递归过程。递归搜索时,因为是自顶向下搜索可以充分利用剪枝技术


rule规则应用的先后顺序和剪枝策略等具体细节,后续会结合源代码补充。