物化视图定时更新

本文为您介绍物化视图定时更新功能和相关操作。

使用说明

  • 物化视图定时更新本质上是系统后台提交了一个任务,完成时间和当前集群资源、任务大小有关。

  • 当前定时更新是全量刷新模式,即:

    • 当分区物化视图中分区列对应的分区基表的某个分区数据发生变化时,只会刷新物化视图中相应的分区,其他分区不受影响;当分区物化视图中被关联的其它表发生变化时,会刷新整个物化视图。

    • 对于非分区物化视图,会自动检查本次更新是否有必要,即假如涉及的源表没有发生变化,则会跳过此次更新。

  • 如果某次刷新所用的时间超过自动刷新指定的间隔,会自动跳过超过的时间点,等到下次最近的时间点再刷新。

    例如,定时刷新时间间隔设置为20分钟,第一次刷新时间是10:00:00时,那么按照刷新时间间隔,理论上第二次刷新时间是10:20:00,第三次刷新时间是10:40:00

    如果10:00:00开始第一次刷新后,一直到10:30:00刷新才结束,那么10:20:00的刷新会被跳过,直到10:40:00再开始刷新。

  • 当前MaxCompute无法实时感知到设置了定时更新的物化视图,有一定延时(30分钟以内)。

打开物化视图定时更新功能

MaxCompute提供了三种设置物化视图定时刷新数据的方式。

本文示例创建物化视图都是基于mf_refresh表。

CREATE TABLE mf_refresh (id bigint, name string);
INSERT INTO TABLE mf_refresh VALUES (1,'kyle'),(2,'tom');

通过EVERY参数设置

创建物化视图时指定更新频率,每N分钟/小时/天更新一次。下一次更新时间点为上次更新数据时间点加N分钟/小时/天。

  • 语法命令

    CREATE MATERIALIZED VIEW [IF NOT EXISTS] [project_name.]mv_name 
    [LIFECYCLE days] -- 指定生命周期
    [(col_name [COMMENT col_comment], ...)] -- 列注释
    [DISABLE REWRITE] -- 指定是否用于改写
    [PARTITIONED BY (col_name [, col_name, ...]) -- 创建物化视图表为分区表
    [CLUSTERED BY|RANGE CLUSTERED BY (col_name [, col_name, ...])
    [SORTED BY (col_name [ASC | DESC] [, col_name [ASC | DESC] ...])]
    INTO number_of_buckets BUCKETS]--用于创建聚簇表时设置表的Shuffle和Sort属性
    
    [REFRESH EVERY xx MINUTES/HOURS/DAYS] -- 设置物化视图定时更新间隔
    TBLPROPERTIES("enable_auto_refresh"="true") -- 开启自动更新
    AS <select_statement>;
  • 使用示例

    创建一个每10分钟更新一次的物化视图。

    1. 创建物化视图mf_mv_refresh,并进行查询。

      CREATE MATERIALIZED VIEW IF NOT EXISTS mf_mv_refresh  
      REFRESH EVERY 10 minutes 
      TBLPROPERTIES("enable_auto_refresh"="true") 
      AS SELECT id,name FROM mf_refresh; 
      
      SELECT * FROM mf_mv_refresh;

      返回结果如下。

      +------------+------------+
      | id         | name       |
      +------------+------------+
      | 1          | kyle       |
      | 2          | tom        |
      +------------+------------+
    2. 再次插入数据。

      INSERT INTO TABLE mf_refresh VALUES (3,'jen'),(4,'cathy'); 
    3. 十分钟后查询视图。

      SELECT * FROM mf_mv_refresh;

      返回结果如下。

      +------------+------------+
      | id         | name       |
      +------------+------------+
      | 1          | kyle       |
      | 2          | tom        |
      | 3          | jen        |
      | 4          | cathy      |
      +------------+------------+

通过TBLPROPERTIES属性的refresh_interval_minutes参数设置

创建物化视图时指定更新频率,每N分钟更新一次。下一次更新时间点为上次更新数据时间点加N分钟。

  • 语法命令

    CREATE MATERIALIZED VIEW [IF NOT EXISTS] [project_name.]mv_name
    [LIFECYCLE days] -- 指定生命周期
    [(col_name [COMMENT col_comment], ...)] -- 列注释
    [DISABLE REWRITE] -- 指定是否用于改写
    [PARTITIONED BY (col_name [, col_name, ...]) -- 创建物化视图表为分区表
    [CLUSTERED BY|RANGE CLUSTERED BY (col_name [, col_name, ...])
    [SORTED BY (col_name [ASC | DESC] [, col_name [ASC | DESC] ...])]
    INTO number_of_buckets BUCKETS]--用于创建聚簇表时设置表的Shuffle和Sort属性
    TBLPROPERTIES("enable_auto_refresh"="true", "refresh_interval_minutes"="xx")
    -- 开启定时更新
    AS <select_statement>;
  • 使用示例

    创建一个每20分钟更新一次的物化视图。

    1. 创建物化视图mf_mv_refresh2,并进行查询。

      CREATE MATERIALIZED VIEW IF NOT EXISTS mf_mv_refresh2 
      TBLPROPERTIES("enable_auto_refresh"="true", "refresh_interval_minutes"="20") 
      AS SELECT id,name FROM mf_refresh; 
      
      SELECT * FROM mf_mv_refresh2; 

      返回结果如下。

      +------------+------------+
      | id         | name       |
      +------------+------------+
      | 1          | kyle       |
      | 2          | tom        |
      | 3          | jen        |
      | 4          | cathy      |
      +------------+------------+
    2. 再次向表中插入数据。

      INSERT INTO TABLE mf_refresh VALUES (5,'roger'),(6,'david'); 
    3. 20分钟后查询视图。

      SELECT * FROM mf_mv_refresh2; 

      返回结果如下。

      +------------+------------+
      | id         | name       |
      +------------+------------+
      | 1          | kyle       |
      | 2          | tom        |
      | 3          | jen        |
      | 4          | cathy      |
      | 5          | roger      |
      | 6          | david      |
      +------------+------------+

通过TBLPROPERTIES属性的refresh_cron参数设置

根据cron定时器,可以配置定时间隔更新或者定点更新,间隔定点更新等。

  • 语法命令

    CREATE MATERIALIZED VIEW [IF NOT EXISTS] [project_name.]mv_name
    [LIFECYCLE days] -- 指定生命周期
    [(col_name [COMMENT col_comment], ...)] -- 列注释
    [DISABLE REWRITE] -- 指定是否用于改写
    [PARTITIONED BY (col_name [, col_name, ...]) -- 创建物化视图表为分区表
    [CLUSTERED BY|RANGE CLUSTERED BY (col_name [, col_name, ...])
    [SORTED BY (col_name [ASC | DESC] [, col_name [ASC | DESC] ...])]
    INTO number_of_buckets BUCKETS]--用于创建聚簇表时设置表的Shuffle和Sort属性
    
    TBLPROPERTIES("enable_auto_refresh"="true", "refresh_cron"="xx")
    -- 开启定时更新
    AS <select_statement>;

    其中refresh_cron对应的参数是QUARTZ Cron格式的字符串,使用详情请参见Cron expression examples

  • 使用示例

    • 创建一个每5分钟更新一次的物化视图。

      1. 创建物化视图mf_mv_refresh3,并进行查询。

        CREATE MATERIALIZED VIEW IF NOT EXISTS mf_mv_refresh3 
        TBLPROPERTIES("enable_auto_refresh"="true", "refresh_cron"="* */5 * * * ? *") 
        AS SELECT id,name FROM mf_refresh; 
        
        SELECT * FROM mf_mv_refresh3; 

        返回结果如下。

        +------------+------------+
        | id         | name       |
        +------------+------------+
        | 1          | kyle       |
        | 2          | tom        |
        | 3          | jen        |
        | 4          | cathy      |
        | 5          | roger      |
        | 6          | david      |
        +------------+------------+
      2. 再次插入数据。

        INSERT INTO TABLE mf_refresh VALUES (7,'ethan'),(8,'cal');
      3. 5分钟后查询视图。

        SELECT * FROM mf_mv_refresh3;

        返回结果如下。

        +------------+------------+
        | id         | name       |
        +------------+------------+
        | 1          | kyle       |
        | 2          | tom        |
        | 7          | ethan      |
        | 8          | cal        |
        | 3          | jen        |
        | 4          | cathy      |
        | 5          | roger      |
        | 6          | david      |
        +------------+------------+ 
    • 创建一个每天晚上8点更新一次的物化视图。

      1. 创建物化视图mf_mv_refresh4,并进行查询。

        CREATE MATERIALIZED VIEW IF NOT EXISTS mf_mv_refresh4 
        TBLPROPERTIES("enable_auto_refresh"="true","refresh_cron"="0 0 20 * * ? *") 
        AS SELECT id,name FROM mf_refresh; 
        
        SELECT * FROM mf_mv_refresh4; 

        返回结果如下。

        +------------+------------+
        | id         | name       |
        +------------+------------+
        | 1          | kyle       |
        | 2          | tom        |
        | 7          | ethan      |
        | 8          | cal        |
        | 3          | jen        |
        | 4          | cathy      |
        | 5          | roger      |
        | 6          | david      |
        +------------+------------+
      2. 再次插入数据。

        INSERT INTO TABLE mf_refresh VALUES (9,'annie'),(10,'zoe');
      3. 20:00后,查询视图。

        SELECT * FROM mf_mv_refresh4;

        返回结果如下。

        +------------+------------+
        | id         | name       |
        +------------+------------+
        | 1          | kyle       |
        | 2          | tom        |
        | 9          | annie      |
        | 10         | zoe        |
        | 7          | ethan      |
        | 8          | cal        |
        | 3          | jen        |
        | 4          | cathy      |
        | 5          | roger      |
        | 6          | david      |
        +------------+------------+  

更新物化视图刷新时间

可以使用如下命令对已存在的物化视图设置定时更新。

ALTER MATERIALIZED VIEW mf_mv_refresh2 SET TBLPROPERTIES("enable_auto_refresh"="true", "refresh_interval_minutes"="xx");
ALTER MATERIALIZED VIEW mf_mv_refresh3 SET TBLPROPERTIES("enable_auto_refresh"="true", "refresh_cron"="xx");

关闭定时刷新功能

可以使用如下命令关闭物化视图定时更新功能。

ALTER MATERIALIZED VIEW mf_mv_refresh SET TBLPROPERTIES("enable_auto_refresh"="false");

查看物化视图更新历史

可以使用如下命令查看物化视图更新历史。

DESC EXTENDED mf_mv_refresh;

返回结果,请参见查询物化视图信息

相关文档