物化视图 (Materialized View)
物化视图将视图查询的结果集实际存储在物理磁盘上,由于数据是预先计算并存储的,查询时可以提供更快的访问速度,特别是对于复杂计算和大数据量的查询。
创建和删除物化视图
同创建视图类似,可以在数据库页面或通过 SQL 创建物化视图,也可以通过 Java 或 Scala 脚本来定义物化视图。
例如,使用 SQL 通过 person 表创建一个名为 person_age 的物化视图:
CREATE MATERIALIZED VIEW person_age AS SELECT sum(age) FROM person;
如果要删除 person_age 物化视图:
DROP MATERIALIZED VIEW IF EXISTS person_age;
关于 SQL 创建或删除物化视图请参阅:
物化视图的增量刷新
物化视图的实现机制是采用增量刷新的机制。当触发增量数据刷新的时候,物化视图会获取底层数据表的增量数据并根据查询请求对增量数据进行处理计算,然后将计算后的数据添加保存(物化)到物化视图中。当我们进行物化视图查询的时候,可以基于物化后的数据得到最终的结果,避免了从原始数据表访问大量的数据。

物化视图支持单张源数据表或者多张源数据表的查询。
对于单数据表的情况,默认每次触发增量刷新的时候获取表的增量数据,并基于该增量数据进行计算和保存。
对于多数据表的 join 查询情况, 默认每次触发增量刷新的时候获取第一张表的增量数据以及其他所有表的全量数据,在进行 join 查询后将结果进行物化保存。您也可以在指定源表名上添加"(stream)"后缀来指定获取该表的增量数据,这时候没有添加后缀的表会获取其全量数据。
例如, 使用 SQL 创建一个基于多数据表的物化视图:
CREATE MATERIALIZED VIEW person_age AS
SELECT sum(t1.a) sa FROM t1(stream) LEFT JOIN t2 ON t1.a = t2.b;
物化视图支持的查询操作
物化视图不支持获取的源表的增量数据中包含 Delete、Update 等操作。
下面表格列举了物化视图支持的一些操作或特征, 如果不支持相应查询操作物化视图的查询会基于源表的全量数据进行计算。
操作 | 是否支持 |
---|---|
single table | ✔ |
Joins, including self-joins | ✔ |
Nested subqueries within MV (Materialized View) | ✔ |
Nested MV | ❌ |
Time travel | ✔ |
UDFs (SQL, Java, Scala) | ✔ |
Window Function | ❌ |
Having clauses | ✔ |
Pivot Clause | ❌ |
Order by clause | ✔ |
Limit | ✔ |
Distinct | ✔ |
Distinct combined with Agg Function | ✔ |
Group by keys(within the select list) | ✔ |
Group by keys(not within the select list) | ✔ |
Group by Grouping sets | ✔ |
Group by rollup | ✔ |
Group by cube | ✔ |
MINUS, EXCEPT, INTERSECT operators | ❌ |
物化视图支持的聚合函数
下面表格列举了物化视图支持的一些聚合操作的函数 (Aggregate Function), 如果不支持相应聚合操作物化视图的查询会基于源表的全量数据进行计算。
聚合函数 | 是否支持 |
---|---|
AVG | ✔ |
BITAND_AGG | ✔ |
BITOR_AGG | ✔ |
BITXOR_AGG | ✔ |
COUNT | ✔ |
COUNT_IF | ✔ |
MAX | ✔ |
MIN | ✔ |
SUM | ✔ |
STDDEV, STDDEV_SAMP | ✔ |
VARIANCE (VARIANCE_SAMP, VAR_SAMP) | ✔ |
VARIANCE_POP (VAR_POP) | ✔ |