物化视图

最近更新时间:2023-06-20 14:58:41

我的收藏
注意:
目前数据湖计算 DLC 物化视图只支持 SparkSQL 引擎和 Presto 引擎。
物化视图(Materialized View)是数据库中的一种特殊对象,它是一个预先计算和存储的查询结果集。物化视图在处理大量数据和复杂查询时可以提供快速的查询性能。
物化视图提高查询性能的同时也引入了存储成本和计算成本。我们建议您在以下场景使用物化视图:
源表变更不频繁
相比于源表,物化视图表的字段和结果数量有明显的减少
DLC 支持普通物化视图和映射物化视图,以下是介绍和完整的使用示例,支持的语法列表可以参考物化视图语法

普通物化视图

普通物化视图的基本使用流程包括创建、刷新、使用。
以下基于 Presto 引擎操作举例完整流程。

准备数据

执行 SQ L创建库表,并插入数据。以下语句创建了一个名为student的表。
CREATE DATABASE IF NOT EXISTS mv_test3;
create table student(id int, name string, score int);
insert into student values (1,'zhangsan', 90);
insert into student values (2,'lisi', 100);
insert into student values (3,'wangwu', 80);
insert into student values (4,'zhaoliu', 30);
select * from student order by id;

创建普通物化视图

使用CREATE MATERIALIZED VIEW语句来创建物化视图。指定物化视图的名称和查询语句,可以选择性地指定查询的来源表和条件。
以下例子,使用了一个简单的 SELECT 语句从表student中选择所有分数,并对它们进行求和操作。然后将这个求和结果作为物化视图mv_student_sum的内容。
CREATE MATERIALIZED VIEW mv_student_sum AS (
select sum(score) from student
);

查看物化视图详情

使用DESCRIBE MATERIALIZED VIEW语句来查看物化视图的详细信息,包括名称、查询语句和刷新状态等。
DESCRIBE MATERIALIZED VIEW mv_student_sum;




手动刷新物化视图

使用REFRESH MATERIALIZED VIEW语句来手动刷新物化视图的数据。
此处仅作演示,大部分情况下,您并不需要手动刷新物化视图,只要 SQL 命中了源表有变更的物化视图就会自动刷新。
REFRESH MATERIALIZED VIEW mv_student_sum;

查看物化视图的执行任务列表

使用SHOW MATERIALIZED VIEW JOBS语句来查看物化视图的执行任务列表,可以了解到物化视图的刷新历史和状态。
SHOW MATERIALIZED VIEW JOBS IN mv_student_sum;




SQL 改写执行

使用 SELECT 语句查询数据,期望自动改写并命中物化视图。可以通过查询结果里的统计数据,查看是否自动改写到了物化视图上。
select sum(score) from student;




删除物化视图

DROP MATERIALIZED VIEW mv_student_sum;

映射物化视图

映射物化视图是一种特殊类型的物化视图,它与现有的表进行映射关联。通过映射物化视图,可以将物化视图的查询结果与现有表的数据进行关联,从而实现对现有表的查询性能优化。

限制

物化视图相对于普通物化视图有以下限制:
映射物化视图不支持刷新操作,即无法通过REFRESH MATERIALIZED VIEW语句来刷新物化视图的数据。因此,物化视图的数据只能与映射表的数据保持一致,无法自动更新。
映射物化视图不进行自动SQL改写,即查询语句不会自动转换为使用物化视图。需要手动指定使用物化视图的查询语句。
删除映射物化视图时,只会删除与映射表的关联关系,而不会删除映射表本身。映射表仍然存在,可以继续使用。

推荐场景

推荐您在以下场景使用映射物化视图:
当已经存在一个数据量较大的表,并且该表的查询性能较低时,可以通过映射物化视图来优化查询性能。
当需要保持物化视图的数据与现有表的数据保持一致,并且不需要自动刷新物化视图时,可以使用映射物化视图。

Iceberg 类型的源表

Iceberg 表为源表时,完整示例如下:

基于 CTAS 创建映射物化视图

映射物化视图需要与待映射的表保持名称一致。以下例子先基于CTAS创建表,用于映射MV的创建。数据的准备可以参考普通物化视图中完整示例中的数据准备一节。
CREATE TABLE link_mv_student AS (
select sum(score) from student
);
--创建映射物化视图:使用CREATE MATERIALIZED VIEW语句创建映射物化视图。
--在创建物化视图时,使用WITH META LINK子句,并指定映射表的名称作为关联。
CREATE MATERIALIZED VIEW link_mv_student WITH META LINK AS (
select sum(score) from student
);

查看映射物化视图

使用 DESCRIBE MATERIALIZED VIEW 语句可以查看映射物化视图的详细信息,包括名称、查询语句和刷新状态等。
DESCRIBE MATERIALIZED VIEW link_mv_student;
SHOW MATERIALIZED VIEW JOBS IN link_mv_student;

映射物化视图不支持刷新操作

映射物化视图不支持 REFRESH 操作,即无法通过 REFRESH MATERIALIZED VIEW 语句来刷新物化视图的数据。因此,物化视图的数据只能与映射表的数据保持一致,无法自动更新。

SQL 改写

映射物化视图不会自动对查询语句进行 SQL 改写。
如执行select sum(score) from student; 不会命中映射物化视图。
可以通过使用 Hint 或 TaskConf 参数来指定允许基于映射物化视图进行 SQL 改写。
--手动指定需要改写SQL
select /*+ OPTIONS('eos.sql.materializedView.enableRewrite'='true') */
sum(score) from student;

删除映射物化视图

使用 DROP MATERIALIZED VIEW 语句来删除映射物化视图。删除映射物化视图后,仅会删除与映射表的关联关系,映射表本身仍然存在。
DROP MATERIALIZED VIEW link_mv_student;
DESCRIBE link_mv_student; --可查看源表还存在

Hive 类型的源表

Hive 表为源表时,完整示例如下:

准备初始化数据

首先,需要准备初始化数据并创建Hive基表。使用 CREATE EXTERNAL TABLE 语句创建 Hive 基表,并通过 INSERT 语句手动插入数据。
CREATE EXTERNAL TABLE student_2(id int, name string, score int)
LOCATION 'cosn://guangzhou-test-1305424723/mv_test4/student_2';
insert into student_2 values (1,'zhangsan', 90);
insert into student_2 values (2,'lisi', 100);
insert into student_2 values (3,'wangwu', 80);
insert into student_2 values (4,'zhaoliu', 30);
select * from student_2;

创建被映射的 Hive 外表

使用 CREATE EXTERNAL TABLE 语句创建一个被映射的 Hive 外表。
CREATE EXTERNAL TABLE link_mv_student_hive (
sum_score BIGINT
) LOCATION 'cosn://guangzhou-test-1305424723/mv_test4/link_mv_student_hive';

向映射表插入数据,使用 INSERT OVERWRITE 语句将查询结果插入到映射表中,确保映射表的数据与 Hive 基表的数据保持一致。
--向映射表插入数据
INSERT OVERWRITE link_mv_student_hive 
select sum(score) from student;

基于 Hive 外表创建映射物化视图

使用 CREATE MATERIALIZED VIEW 语句创建映射物化视图。在创建物化视图时,使用 WITH META LINK 子句,并指定上述 Hive 外表的名称作为关联。
CREATE MATERIALIZED VIEW link_mv_student_hive WITH META LINK AS (
select sum(score) from student_2
);