背景
物化视图(Materialized View):是一种特殊的物理表,本质是预计算,是多个计算过程之间的联系建立。从数据组织层面优化数据访问效率,即把某些耗时的操作(例如JOIN、AGGREGATE)的结果保存到物理存储上,可以像表一样被访问,以便在后续查询时直接复用,最终达到加速查询的目的,即空间换时间。而普通视图(View)仅是简化用户的查询定义,不存储实际结果数据。
物化视图使用存在一定门槛,提高查询性能的同时也引入了相应的成本:
- 存储成本:物化表存储空间;
- 计算成本:若源表(base表)数据变更,物化视图自动失效,需计算更新后才可用;
因此,物化视图并不适合所有场景,使用物化视图条件:提速收益 > 存储成本 计算成本。
物化视图适合场景:
- 源表变更不频繁:降低计算成本;
- 相比于源表,物化表的字段和结果数量有明显的减少:降低存储成本;
- 物化表查询子句的执行是高成本的,(1).计算频繁,(2).计算复杂(消除Join和聚合的计算开销),(3).读取扫描量大:提高加速收益;
使用场景示例:
- 查询存储在外部(冷存储),相比于内部存储(热存储),外部存储性能较低;
- 对于数据仓库,物化视图可物化查看结果,屏蔽多个数据源差异,实现本地副本;
视图改写
视图改写常用的方式:
- 基于语法改写:最简单的改写方式,将查询的文本与物化视图的文本或语法树进行比较,完全匹配则可以进行改写;
- 基于规则改写:针对不同规则,穷举所有可能变换关系来寻找等价替代关系树;
- 基于结构改写:提取查询特征并使用一套规则进行匹配改写,将查询表示为SPJG标准形式,提取查询中Join、Projects、Filters、Grouping、Aggregation五种表达式,分别与物化视图对应的表达式进行匹配改写;
Calcite 物化视图查询改写支持两种方式:
- 基于规则改写: 由 MaterializedViewSubstitutionVisitor实现,基于规则和等价类自底向上匹配
- 基于结构改写:由 MaterializedViewRule 规则集构成,基于查询优化器实现改写
Calcite物化视图的结构改写逻辑主要基于Goldstein 和 Larson 的“Optimizing Queries Using Materialized Views: A Practical, Scalable Solution”实现(Microsoft SQL Server的改写方案),是一种SPJG(join-select-project-groupBy)重写算法。
SPJ(join-select-project)视图改写条件:
- The view contains all rows needed by the query expression:视图行数据可覆盖包含查询表达式的所有行;
- All required rows can be selected from the view:查询结果可通过视图查询到;
- All output expressions can be computed from the output of the view:查询结果表达式可通过视图计算查询到;
- All output rows occur with the correct duplication factor:对于重复语义的算子,有相同一致的行为,如distinct算子在相同的字段;
Calcite MaterializedViewRule 实现结构改写规则,可参考单测 MaterializedViewRelOptRulesTest
Lattice
Lattice(格):是一个数学概念,表示数学上的一种集合,非空有限子集都有一个上确界(并)和一个下确界(交)的偏序结合。Calcite针对物化视图对Lattice进行扩展,根据用户定义的关联和聚合要求,划分出多个物化视图来适应不同类别的查询,支持自动划分物化视图。 Calcite中Lattice定义功能:
- 可声明主键和外键约束;
- 辅助优化器将用户查询映射到物化视图;
- 提供框架,用于采集数据量和用户查询统计信息;
- 允许Calcite自动产生物化视图;
我正在参与2024腾讯技术创作特训营最新征文,快来和我瓜分大奖!