
# StarRocks物化视图概述
物化视图是包含一个查询结果的数据库对象，它可以是远端数据的一份本地拷贝，也可以是一个表或一个**join**结果的行/列的一个子集，还可以是使用聚合函数的一个汇总。相对于普通的逻辑视图，将数据物化后，能提升查询性能。物化视图包含同步物化视图和异步物化视图。
#### 物化视图原理介绍
物化视图的数据组织形式和基表、RollUp表相同。用户可以在新建基表时添加物化视图，也可以对已有表添加物化视图，这种情况下，基表的数据会自动以异步方式填充到物化视图中。基表可以拥有多张物化视图，向基表导入数据时，会同时更新基表的所有物化视图。数据导入操作具有原子性，因此基表和它的物化视图保持数据一致。
物化视图创建成功后，用户原有查询基表的SQL语句保持不变，StarRocks会自动选择一个最优的物化视图，从物化视图中读取数据并计算。用户可以通过**EXPLAIN**命令检查当前查询是否使用了物化视图。
物化视图中的聚合和查询中聚合的函数对应关系如[表1]所示。其中**bitmap** 和**hll**的聚合函数在查询匹配到物化视图后，查询的聚合算子会根据物化视图的表结构进行改写。
 表1物化视图聚合和查询中聚合的函数对应关系 
| 物化视图聚合函数     | 查询中聚合函数                                             |
|:---|:---|
| sum          | sum                                                 |
| min          | min                                                 |
| max          | max                                                 |
| count        | count                                               |
| bitmap_union | bitmap_union、bitmap_union_count、count(distinct)     |
| hll_union    | hll_raw_agg、hll_union_agg、ndv、approx_count_distinct |
   
#### 同步异步物化视图对比
表2物化视图对比 
| 物化视图   | 单表聚合    | 多表关联 | 查询改写 | 刷新策略      | 基表                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
|:---|:---|:---|:---|:---|:---|
| 异步物化视图 | 是       | 是    | 是    | 异步刷新、手动刷新 | 支持多表构建。基表可以来源： - Default Catalog。  - External Catalog。  - 已有异步物化视图。  - 已有物化视图。   |
| 同步物化视图 | 仅部分聚合函数 | 否    | 是    | 导入同步刷新    | 仅支持基于Default Catalog的单表构建。                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
   
#### 基本概念
- 基表：物化视图的驱动表。对于StarRocks的异步物化视图，基表可以是Default Catalog中的内部表、外部数据目录中的表，甚至是已有的异步物化视图或视图。StarRocks支持在所有StarRocks表类型上创建异步物化视图。
- 刷新：创建异步物化视图后，其中的数据仅反映创建时刻基表的状态。当基表中的数据发生变化时，需要通过刷新异步物化视图更新数据变化。目前StarRocks支持两种异步刷新策略ASYNC、MANUAL。
  - ASYNC：异步刷新，每当基表中的数据发生变化时，物化视图根据指定的刷新间隔自动触发刷新任务。
  
  - MANUAL：手动触发刷新。物化视图不会自动刷新，需要用户手动维护刷新任务。
   
- 查询改写： 查询改写是指在对已构建了物化视图的基表进行查询时，系统自动判断是否可以复用物化视图中的预计算结果处理查询。如果可以复用，系统会直接从相关的物化视图读取预计算结果，以避免重复计算消耗系统资源和时间。
  StarRocks支持基于SPJG类型异步物化视图的自动、透明查询改写。SPJG类型的物化视图是指在物化视图Plan中只包含Scan、Filter、Project以及Aggregate类型的算子。
  
 
