下面三位大佬是在优化器领域的代表性人物。今天进入第三位大佬的作品:Volcano,其后续优化版是Cascade。


VOLCANO优化器_java



要思想和Starburst类似,采用规则机制、主打可拓展性。把优化器做成类似yacc的生成器,而不是采用硬编码的机制。首次发表在以下论文中:The Volcano Optimizer Generator: Extensibility and Efficient Search,ICDE93


VOLCANO优化器_java_02

规则变换

  • logical→logical,比如A join B可以替换为B join A

  • logical→physical,比如A join B可以替换成 A hashjoin B或者A merge join B。

注意,规则系统是带有if条件的,只有满足条件时才能进行替换。下面的伪代码中叫做moves

规则系统是可以拓展的,如果数据库开发了新的feature,硬编码的工作量会很大。



伪代码

VOLCANO优化器_java_03


整体过程是一个递归,过程中递归规则替换。这个大体框架类似于求数组全排列的经典问题的代码框架。


注意:上述代码第三个参数limit,可以用于bound剪枝。


优化器就是一个search engine,枚举出所有plan,并search出代价最优或尽可能好的plan。