注意:
目前数据湖计算 DLC 物化视图只支持 SparkSQL 引擎和 Presto 引擎。
物化视图(Materialized View)是数据库中的一种特殊对象,它是一个预先计算和存储的查询结果集。物化视图在处理大量数据和复杂查询时可以提供快速的查询性能。
物化视图提高查询性能的同时也引入了存储成本和计算成本。我们建议您在以下场景使用物化视图:
源表变更不频繁
相比于源表,物化视图表的字段和结果数量有明显的减少
普通物化视图
普通物化视图的基本使用流程包括创建、刷新、使用。
以下基于 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 改写。
--手动指定需要改写SQLselect /*+ 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_hiveselect 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);