Query Optimization for Distributed Database Systems
Calcite是开源的一套查询引擎,很多开源项目都使用了该开源项目,特别是对其Optimizer部分的使用,类似Drill、Hive、Flink都使用Calcite作为其优化引擎。
Calcite实现了两套Planner,HepPlanner和VolcanoPlanner,HepPlanner主要是一种贪婪式的Planner,而Volcano则是一种启发式的Planner,下面介绍下HepPlanner的源码实现。
1 HepPlanner介绍
HepPlanner是一套greedy方式的Planner,可以认为是所优即所得,即任何rule只要命中运行,就认为其产生的结果是更优。
例:Calcite实现的ProjectFilterTransposeRule,功能主要是将Project与Filter进行交换。
subTree1:
Project($0, $1)
Filter($0 > 1)
-->rule apply to
subTree2:
Filter($0 > 1)
Project($0, $1)
则HepPlanner会将subTree2作为更优的plan。
2 实现原理
实现原理主要分为几部分来介绍:
1)HepRelVertex
2)Graph & Vertex
3)HepProgram
4)Rule apply
2.1 HepRelVertex
HepRelVertex是对关系代数表达式RelNode进行了简单封装。HepPlanner的所有节点都是HepRelVertex,每个HepRelVertex都指向了一个真正的relNode节点。
如
Project($0, $1)
TableScan($0,