tencent cloud

文档反馈

物化视图

最后更新时间:2024-07-31 18:03:40
    注意:
    目前数据湖计算 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
    );
    
    联系我们

    联系我们,为您的业务提供专属服务。

    技术支持

    如果你想寻求进一步的帮助,通过工单与我们进行联络。我们提供7x24的工单服务。

    7x24 电话支持