全量刷新物化视图

您可以在创建物化视图时指定刷新模式。

权限要求

  • 创建视图需要有数据库或表级别的CREATE权限。

  • 刷新物化视图需要有数据库或表级别的INSERT权限。

  • 需要有物化视图所涉及的所有表的相关列(或整个表)的SELECT权限。

  • 如果在创建物化视图时指定物化视图为自动刷新模式,需要具备通过服务器本地(即127.0.0.1)或者任意IP(即'%')刷新视图的权限。

使用建议

若集群规格较小,尽量避免在同一时刻刷新集群内的所有物化视图,以免影响集群稳定性。

创建物化视图时指定刷新模式

CREATE [OR REPLACE] MATERIALIZED VIEW <mv_name>
[MV DEFINITION]
[REFRESH [COMPLETE|FAST] [ON [DEMAND |OVERWRITE] [START WITH date] [NEXT date]]]
[QUERY REWRITE]
AS 
<QUERY BODY>;
  • 物化视图刷新模式分为全量刷新(COMPLETE)和增量刷新(FAST)。如果未指定刷新模式,默认为全量刷新。全量刷新会计算刷新时刻的查询结果,并且用覆盖的方式替换原来的结果。

    说明

    3.1.9.0及以上版本支持单表增量刷新物化视图;3.2.0.0及以上版本支持多表增量刷新物化视图。详情请参见增量刷新物化视图(预发)

    • 查看企业版基础版湖仓版集群的内核版本,请执行SELECT adb_version();。如需升级内核版本,请联系技术支持。

    • 查看和升级数仓版集群的内核版本,请参见查看和升级版本

  • 物化视图刷新触发机制分为按需刷新(ON DEMAND)和基表被INSERT OVERWRITE覆写后自动刷新(ON OVERWRITE)。如果未指定触发方式,默认为按需刷新。

全量刷新

全量刷新既支持手动刷新,也支持自动刷新。

适用场景

全量刷新适用于T+1类的离线场景。常见的适用场景如下:

  • 数据每天批量更新一次,或者小时级别更新一次,更适合全量刷新。这类SQL通常比较复杂,全量刷新对SQL语法没有任何约束。

  • 在某些分钟级别延迟的场景中也可以使用全量刷新,往往这类SQL即使全量计算成本也不大,通常十几秒能完成,还可以达到一定的实时效果。

示例

  • 手动刷新。示例如下:

    CREATE MATERIALIZED VIEW my_mv1
    REFRESH COMPLETE
    AS
    SELECT * FROM base;
    REFRESH MATERIALIZED VIEW my_mv;
  • 按需自动刷新。每天凌晨2点刷新,示例如下:

    CREATE MATERIALIZED VIEW my_mv2
    REFRESH COMPLETE ON DEMAND
     START WITH DATE_FORMAT(now() + interval 1 day, '%Y-%m-%d 02:00:00')
     NEXT DATE_FORMAT(now() + interval 1 day, '%Y-%m-%d 02:00:00')
    AS
    SELECT * FROM base;
    说明

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

    假设自动刷新设置是在00:05:00, 00:10:00, 00:15:00这3个时间点,间隔5分钟。如果00:05:00时候开始了某次刷新,一直到00:12:00刷新才结束,那么设置的00:10:00刷新会被跳过,直到00:15:00再开始刷新。

  • 基表被INSERT OVERWRITE覆写后触发物化视图自动刷新。示例如下:

    创建物化视图:

    CREATE MATERIALIZED VIEW my_mv3
    REFRESH COMPLETE ON OVERWRITE
    AS
    SELECT * FROM base;

    物化视图引用的基表在执行INSERT OVERWRITE语句导致数据被覆盖后,会触发自动刷新。

    INSERT OVERWRITE base SELECT * FROM t0; 

增量刷新

增量刷新仅支持按需自动刷新。增量刷新请参见物化视图增量刷新(预览版)

相关文档