优化器是对关系节点树做等价变换得到最小代价的执行计划的组件。
优化器执行框架涉及的主要概念如下:
优化规则(RelOptRule):可对关系节点进行等价转换,包括规则模式定义,模式识别,规则执行,执行关联操作等步骤。
关系集合(RelSet):包含具有不同特性集的关系子集合,一般和关系节点树的根节点对应。
关系子集合(RelSubSet):具有相同特性集合的关系节点组成,特性集和关系子集和一一对应。
特性(RelTrait):目前calcite有排序和转换两种特性,drill包含了分布的特性。特性作用于关系节点。特性是一类优化规则的集合,也是开关。
特性定义(RelTraitDef): calcite中包含ConventionTraitDef和RelCollationTraitDef。ConventionTraitDef内部为特性转换图,边为规则,节点为特性,通过添加规则来构造图,和ConverterRule接口的优化规则配合进行关系节点优化;RelCollationTraitDef主要用于与排序相关的关系节点的优化。
转换器规则(ConverterRule):以特性和关系表达式为操作对象,以特性转换为操作内容,以相同语义关系表达式为操作结果,添加规则过程是构建特性定义ConventionTraitDef中特性转换图的过程。
这些概念串联起来可表述为:优化规则(RelOptRule)把具有一种特性集(RelTraitSet)的关系节点(RelNode)转换到另一种特性集的关系节点, 特性需要有特性定义(RelTraitDef),特性转换需要有转换器(AbstractConverter),同一关系集(RelSet)内关系子集(RelSubSet)之间是等价关系,相同特性集的关系节点组成关系子集。优化器从等价的关系集中找出最优。
Calcite中优化器执行框架
一个优化规则的例子:
JoinAssociateRule规则的模式如下:
private JoinAssociateRule() {
super(
operand(Join.class,
operand(Join.class, any()),
operand(RelSubset.class, any())));
}