文档

刷新物化视图

更新时间:

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

  • 权限要求

      • 需要物化视图INSERT权限。

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

      • 如果要启用自动刷新功能,需要创建者在127.0.0.1上有刷新视图的权限。因为系统会代理创建者身份,从服务器本地(127.0.0.1)登录来执行自动刷新。这样当创建者没有权限之后,系统也无法刷新,避免越权问题。如果用户权限是在所有IP上 ('%'),那么就不会产生这个问题,因为所有IP也包括了127.0.0.1。

  • 创建时指定刷新模式

    • 物化视图刷新分为全量刷新(COMPLETE)和增量刷新(FAST)两种刷新模式。如果未指定刷新模式,默认为全量刷新。

      每种刷新模式适用于不同的触发方式。

      CREATE MATERIALIZED VIEW mv_name
      [REFRESH [FAST|COMPLETE] [ON <DEMAND|OVERWRITE>] [START WITH date] [NEXT date]]
      说明

      目前仅支持全量刷新(COMPLETE)。

  • 手动刷新

    • REFRESH MATERIALIZED VIEW <mv_name>

全量刷新模式

创建物化视图时默认为全量刷新模式。全量刷新会计算刷新时刻的查询结果,并且用覆盖的方式替换原来的结果。

  • 全量刷新触发机制

    • ON DEMAND:按需刷新。按需刷新要么用户手动触发刷新,要么自动刷新。全量刷新默认采用按需刷新(ON DEMAND)。

      • 手动刷新。示例如下:

        CREATE MATERIALIZED VIEW my_mv
        REFRESH ON DEMAND
        AS
        SELECT * FROM base;
      • 自动刷新 。5分钟后第一次刷新,此后每分钟1次,示例如下:

        CREATE MATERIALIZED VIEW my_mv
        REFRESH ON DEMAND START WITH now() + interval 5 minute NEXT now() + interval 1 minute
        AS
        SELECT * FROM base;
    • ON OVERWRITE:当基表被INSERT OVERWRITE覆写后,会触发对应物化视图的刷新。适合T+1场景,在数据清洗覆盖后自动更新物化视图。

      创建物化视图:

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

      触动 my_mv 刷新:

      INSERT OVERWRITE base SELECT * FROM t0; 

自动刷新

自动刷新支持使用时间函数(START WITH ... NEXT)来设置刷新规律。START WITH是可选的,默认从当前时刻开始。示例如下:

  • 每周一晚上2点刷新。

    CREATE MATERIALIZED VIEW myview
    REFRESH 
     START WITH DATE_FORMAT(now() + interval 7 - weekday(now()) day, '%Y-%m-%d 02:00:00') 
     NEXT DATE_FORMAT(now() + interval 7 - weekday(now()) day, '%Y-%m-%d 02:00:00')
    AS
    SELECT count(*) as cnt FROM base;
  • 每天凌晨2点刷新。

    CREATE MATERIALIZED VIEW myview
    REFRESH 
     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 count(*) as cnt FROM base;
  • 每个月第一天的凌晨2点刷新。

    CREATE MATERIALIZED VIEW myview
    REFRESH NEXT DATE_FORMAT(last_day(now()) + interval 1 day, '%Y-%m-%d 02:00:00')
    AS
    SELECT count(*) as cnt FROM base;
  • 只刷新一次。

    CREATE MATERIALIZED VIEW myview
    REFRESH START WITH now() + interval 1 day
    AS 
    SELECT count(*) as cnt 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再开始刷新。

相关文档

  • 本页导读 (1)
文档反馈