VolcanoOptimizer
NOTE
论文阅读笔记The Volcano Optimizer Generator: Extensibility and Efficient Search
可扩展
面向对象
自顶向下
剪枝
原型是EXODUS, Volcano是对他的改进
- 可以单独使用的优化器
- 优化搜索时间和搜索空间
- 可扩展
- 可以使用启发式算法和有效的代价模型来扩展和减少搜索空间,【剪枝】
- 灵活的成本计算模型
一个框架,优化器生成器,可以由“optimizer implementor”自行实现关键函数,整个优化器框架的输入是AST,输出是一个执行计划,算子的集合
SQL是基于关系代数,Volcano把关系表达式分为逻辑表达式和物理表达式,逻辑表达式之间使用transformation进行转换,物理表达式使用基于代价的implementation和逻辑表达式映射的,关系不一定是意义对应的,例如scan可以同时一起实现projection
在表达式进行转换的时候可以使用condition进行模式判断,满足条件的时候可以进行变换
表达式使用特征描述输出,
enforcers会强制添加某属性,用于指导优化器进行优化,例如指定表的scan方式
Logical Operator
Operator set,也就是可以描述在目标data model上可以执行的代数运算合
Transformation rules + Condition,对每条等价变换规则,在满足condition时才可以应用
Logical properties : 逻辑属性,用来描述代数运算的输出所具有的一些特征,这些特征与运算的具体执行方式无关,是逻辑的,例如输出的行数,结果集的schema等
Physical Operator
Algorithm + Enforcer set,即可应用的物理实现算法 + 可添加的Enforcer集合
Implementation rules + Condition,满足Condition的前提下,可以尝试该物理算法
Cost model + Cost formula,基于cost选择最优的物理算法
Physical property,与logical property对应,物理属性是选择了特定的算法实现后,输出的数据所具有的物理上的特性,例如数据是否有序、是否具有唯一性,数据在多机上的分布情况等,不同的物理算法,会决定执行该operator产生的物理属性,例如sort merge join会在join key上产生有序属性
Applicability function : 决定一个物理算法,其输出是否可以满足要求父算子对自身的physical property要求,且决定它对自身的输入具有什么样的physical property要求
Enforcer是search engine中一个重要的概念,它用来强制产生某种物理属性。例如上层是join算子,在枚举时会考虑使用sort merge join的物理执行方式(Implementation),但当递归到下层时,子节点可以选择table scan(无序输出),或者index scan(目标序输出),当选择table scan时,由于输出不满足父算子对自身输出的物理属性要求,就可以通过Order Enforcer来产生目标输出,Enforcer表示了排序这个操作,同时也包含了排序操作会产生的代价。
The Search Engine
搜索实现
// PhysProp:: 此LogExpr锁具有的物理属性的要求
FindBestPlan (LogExpr, PhysProp, Limit)
// 如果可以在look-up table找到满足的计划,则代表以及算过,直接返回
if the pair LogExpr and PhysProp is in the look-up table
if the cost in the look-up table < Limit
return Plan and Cost
else
return failure
/* else: optimization required */
// 否则进行优化,由三种优化方式
// 1. 使用转换方法转换为等价的逻辑表达式,且使用相同物理属性计算
// 2. 使用实现方法生成物理表达式,此处是本层的物理表达式,所以会递归调用,且计算本层代价TotalCost,此时是使用
// 代价模型计算代价且使用剪枝
// Applicability functio决定Implementation是否满足PhysProp
// 3. 使用enforcer,计算enforcer的代价,且修改PhysProp为满足enforcer的PhysProp,使用新的PhysProp计算LogExpr
create the set of possible "moves" from
- applicable transformations
- algorithms that give the required PhysProp
- enforcers for required PhysProp
order the set of moves by promise
for the most promising moves
if the move uses a transformation
apply the transformation creating NewLogExpr
call FindBestPlan (NewLogExpr, PhysProp, Limit)
else if the move uses an algorithm
TotalCost := cost of the algorithm
for each input I while TotalCost < Limit
determine required physical properties PP for I
Cost = FindBestPlan (I, PP, Limit - TotalCost)
add Cost to TotalCost
else/* move uses an enforcer */
TotalCost := cost of the enforcer
modify PhysProp for enforced property
call FindBestPlan for LogExpr with new PhysProp
/* maintain the look-up table of explored facts */
// 如果没有在look-up table找到满足的计划,则insert
if LogExpr is not in the look-up table
insert LogExpr into the look-up table
// 记录左右执行计划
insert PhysProp and best plan found into look-up table
return best Plan and Cost
自定向下的搜索,使用三种规则向下扩展搜索空间,使用look-up table记录已搜索的表达式,在表达式没有新的扩展方法,或者达到代价阈值的时候停止搜索,
自顶向下和自底向上
- 自顶向下
volcano,cascades等
- 在等价变形的范围不仅仅限于join,关系代数的等价变换都可以实现,所以理论上,这里可以使用一些启发式的算法,而不必要进行分层
- 可以在优化的过程中基于代价模型进行剪枝
- 自底向上 几乎会枚举所有的执行计划,由更大的搜索空间,且由于在优化的过程中更多的只是为了搜索join order 的执行计划,所以需要提前进行一些启发式的算法,或优化语句结构便于优化器优化,或提前搜索到执行计划结束优化过程。
The Cascades Framework for Query Optimization
对于volcano的改进和优化
- 把原来的搜索流程拆分为单个的task,使用栈来实现,task之间使用一个DGA来维护调度关系
- 不区分逻辑表达式和物理表达式是
- rule抽象为task,是具体的对象,apply 的时候区分表达类型
group: 等价表达式的集合 expr: 表达式,等价表达式使用特征输入和特征输出来表示,表达式的输入可以是表达式,也可以是group,可以视为执行计划中的一个片段。 rule 抽象实现,分为逻辑表达式的转换rule和逻辑表达式转换到物理表达式的Implementation rule 是否可以适用某个rule需要判断表达式可以满足rule的某些要求的规则,这个规则抽象为pattern,如果满足pattern,则可以使用此转换方法转换表达式,转换之后的表达式称为Substitution
- OptimizeGroupTask 优化任务的入口,初始化的时候是整个ast的集合
- OptimizeExprTask
对于group中的所有的表达式,一个表达式可能只是单纯的表达式,也有可能是由其他group作为输入的表达式,所以
- 都表达式使用ApplyRuleTask入栈
- 对于所有表达式中的group,使用ExploreGroupTask入栈,此时对于此节点,会先完成ExploreGroupTask,然后再使用ApplyRuleTask
- 如果是物理表达式,则使用CreatePlanTask
- ApplyRuleTask
对表达式使用rule转换,使用nextSubstitute之后得到Substitution,可以对新的表达式使用
- ExploreExprTask
- OptimizeExprTask
- CreatePlanTask 如果是逻辑表达式,则使用CreatePlanTask
- ExploreGroupTask 对group中的所有表达式调用ExploreExprTask
- ExploreExprTask 对所有的表达式,调用ApplyRuleTask,在表达式使用ApplyRuleTask之前,会先使用ExploreGroupTask扩展表达式的group
- CreatePlanTask 对应的是implementation rule,转换表达式为物理表达式
其中ApplyRuleTask某个表达式的时候,会先递归的使用ExploreGroupTask处理表达式的所有group,所以在transformation某个规则的时候,是整体的引用到整个表达式上