统一SQL平台-加速-物化视图设计与实现-Calcite
一、概述
物化视图 (Materialized View) 是一种特殊的物理表,本质是预计算,把某些耗时的操作(例如JOIN、AGGREGATE)的结果保存到物理存储上,可以像表一样被访问,以便在后续查询时直接复用,最终达到加速查询的目的,即空间换时间。而普通视图(View)**仅是简化用户的查询定义,不存储实际结果数据。
二、实现
2.1. 引擎维护
一些 Calcite 适配器以及依赖于 Calcite 的项目具有自己的物化视图概念,允许用户基于现有表定义物化视图,适配器会自动将这些物化视图暴露给 Calcite。
当在 Hive 中创建物化视图时,用户可以指定视图是否可以在查询优化中使用。如果用户选择这样做,物化视图将在 Calcite 中注册。通过在Calcite 中注册物化视图,优化器有机会自动重写查询以使用这些视图~
2.1.1. 物化视图注册
Calcite Model 可基于 Json 文件定义 Schema,用于描述数据源中 Schema的相关信息,在 model 文件中,可以配置 Materize View SQL,然后 Calcite 会将 MV 的 SQL 解析成 RelNode 而后存储到 VolcanoPlanner#materializations
字段中。
1 | { |
2.2. 视图查询改写
在 RBO 优化之后,可以使用物化视图来对查询进行优化。物化视图本质是特定逻辑下的预计算结果。
下面主要介绍在物化视图匹配过程需要掌握的一些基本概念。
- Calc: 算子,包含 Project 和 Filter 算子,可以理解为列裁剪和行过滤。
- Replacement: 物化视图替换物,即在物化视图匹配后,替换mv-logical的RelNode
- query: 用户写的查询SQL。
- target: 物化视图计算逻辑。
2.2.1. 基于 UnifyRule 规则改写
Calcite 中基于规则查询改写可以在 CBO 优化之前单独进行优化,其主要原理就是通过循环遍历查询 SQL 的 RelNode 关系表达式和生成物化视图 QueryRelNode 表达式,基于 RelNode 关系表达式命中对应的 UnifyRule 规则,如果匹配,就调用对应规则的 apply 方法,使用物化结果的 TableRel 表达式对查询 SQL 关系表达式进行改写。
- 查询:
SELECT a, c FROM t WHERE x = 5 AND b = 4
; - 目标(物化视图定义):
SELECT a, b, c FROM t WHERE x = 5
; - 结果:
SELECT a, c FROM mv WHERE b = 4
;
对于视图和查询关系表达式循环遍历匹配,视图完全相同才会进行改写,可以进行一定的条件补偿
TrivialRule
CalcToCalcUnifyRule
当 query 中的表达式可以从 target 中获取,并且 query 的条件要等于或者弱于 target 的条件,那么就可以进行改写
AggregateOnCalcToAggregateUnifyRule
query 中 Aggregate 算子下有 Calc 算子,target 中是 Aggregate 算子,此规则会将 query 中 Aggregate 算子下的 Calc 算子进行上拉,让改写后的关系代数尽量用 target 的 Aggregate 算子来表达。
经过上一步 Calc 补偿之后,物化识别的 Pattern 变成了Query AggregateOnCalc 去匹配 target 中的 Aggregate 节点,需要能够在 mv 的Aggregate 之上,上提 Calc 补偿条件以及再做一次聚合操作。
根据语义可知,mv 之上,能够表达出 Calc 补偿条件以及做一次二次聚合,在 mv 加上补偿条件以及二次聚合后,最下层的节点 Aggregate-Calc-Scan已经是物化视图的计算逻辑,完成了物化识别,用 Replacement 去替换下层 mv-logical 表达的计算逻辑,即可完成物化表的替换,完成整个物化识别的过程。
2.2.2. 基于 MaterializedViewRule 结构化信息改写
基于 MaterializedViewRule 结构化信息改写,需要添加到 VolcanoPlanner 优化规则集合中和 CBO 优化一起来进行配合使用。
《Optimizing Queries Using Materialized Views: A Practical, Scalable Solution》 一文介绍了一种物化视图重写算法,Calcite 有一种 SPJG 重写算法,正式基于这篇 paper 实现的。这篇论文,主要介绍了一种 **SPJG视图(即 Join-Select-Project-GroupBy 视图)**的基于结构的改写算法。
SPJA 匹配规则集:
由 MaterializedViewRule 规则集构成,基于查询优化器实现改写
2.2. Calcite 维护: 基于物化视图的 Lattice 和 Tile 机制
为了加速在线分析处理,除了物化视图,Calcite 还引入 Lattice 和 Tile 的概念,Lattice 是 Calcite 用于创建和填充物化视图以及识别物化视图可用于解决特定查询的框架。
该机制下物化视图由 Calcite 自身维护,不依赖引擎端~