一、概述

物化视图 (Materialized View) 是一种特殊的物理表,本质是预计算,把某些耗时的操作(例如JOIN、AGGREGATE)的结果保存到物理存储上,可以像表一样被访问,以便在后续查询时直接复用,最终达到加速查询的目的,即空间换时间。而普通视图(View)**仅是简化用户的查询定义,不存储实际结果数据。

1.1. 优/缺点

1.1.1. 优点

  1. 提高查询性能:对于复杂的查询,由于物化视图存储了查询结果,可以直接从物化视图中读取数据,提高了查询效率。
  2. 应急查询:物化视图允许用户在数据库服务器关闭或网络连接中断时,仍然可以访问和分析数据。

1.1.2. 缺点

  1. 存储空间:物化视图需要额外的存储空间来保存查询结果。
  2. 数据更新:如果底层数据频繁变动,物化视图需要定期刷新,这可能会增加维护成本。

物化视图使用得当能够数倍,甚至数十倍提升查询性能,但其也不是万能的,如果不分场景盲目创建物化视图。一方面是因为物化视图的创建和更新有成本,另一方面,判定 SQL 是否命中的逻辑也在性能敏感的代码路径上引入了额外的耗时。

使用物化视图的效果评价需要考虑2个方面:首先,其是否带来了查询的性能提升。这是最基本的目标;其次,是否降低了集群总的资源消耗,包括计算资源和存储资源。这是进阶目标,在每个物化视图都有大量的查询命中时,将会明显减少每个查询对CPU和内存资源的需求,同时也不再需要访问原始表,减少 IO 资源消耗。

二、设计

2.1. 物化数据选择

选择哪些数据需要进行物化,这个通常是由用户自己决定的,我们能做的就是收集用户的统计信息,展示高频的表信息,查询谓词或者子查询,辅助用户判断哪些数据需要物化。

2.2. 数据更新

当原始表增加数据或更新数据后,是直接增量更新到物化视图,还是全量更新到物化视图,实时触发还是延迟触发抑或是定时触发?

2.2.1. 同步更新

2.2.2. 异步更新

2.3. 视图改写

早期使用物化视图时,通常需要人工修改查询 SQL,显式在 SQL 中指定使用物化视图。支持自动查询修改功能后,物化视图自动查询改写功能将自动、透明的重写查询 SQL,使查询 SQL 可以使用物化视图(即使查询 SQL 本身指定的是查询基表而非物化视图),从而加速查询 SQL 的运行。

目前三种改写方法:

  • 基于语法的改写

    最简单的改写方式,将查询的文本与物化视图的文本或语法树进行比较,完全匹配则可以进行改写

  • 基于规则的改写

    针对不同规则,穷举所有可能变换关系来寻找等价替代关系树;

  • 基于结构的改写

    提取查询特征并使用一套规则进行匹配改写,将查询表示为 SPJG 标准形式,提取查询中Join、Projects、Filters、Grouping、Aggregation 五种表达式,分别与物化视图对应的表达式进行匹配改写

三、实现

3.1. Calcite 物化视图实现

3.2. StarRocks 物化视图实现