更新时间:2025-07-10 GMT+08:00
分享

刷新嵌套物化视图

级联刷新

嵌套物化视图中,为了避免单个物化视图刷新繁琐操作,支持自动级联刷新嵌套物化视图。

当前支持五种刷新方式,默认、强制、级联向上、级联向下和全部级联。即对应refresh_behavior取值:DEFAULT、RESTRICT、CASCADE FORWARD、CASCADE BACKWARD和CASCADE ALL。

  • 默认方式:刷新单个物化视图,当物化视图的基表未发生数据变化时,不进行刷新操作,直接跳过。
  • 强制方式:刷新单个物化视图。
  • 级联向上:先刷新当前物化视图,然后依次刷新依赖当前物化视图的嵌套物化视图。
  • 级联向下:找到当前物化视图依赖的所有物化视图,依次从最底层开始刷新,最后刷新当前物化视图。
  • 全部级联:先执行级联向下刷新,再执行级联向上刷新。

级联刷新方式中,采用的是默认刷新方式,即下层物化视图/表数据未发生变化,不进行刷新操作。

示例:

创建嵌套物化视图中创建的嵌套物化视图为例。

对物化视图mv5进行全部级联刷新。

REFRESH MATERIALIZED VIEW mv5 cascade all;

级联刷新流程:先刷新mv1,再刷新mv5,最后刷新mv6。

相当于先对mv5执行级联向下刷新,然后进行级联向上刷新。

REFRESH MATERIALIZED VIEW mv5 cascade backward;
REFRESH MATERIALIZED VIEW mv5 cascade forward;

对于级联向下刷新,会先找到mv5依赖的所有底层物化视图,然后从底层向上层,逐层进行物化视图刷新。即执行:

REFRESH MATERIALIZED VIEW mv5 cascade backward;

级联刷新流程:先刷新mv1,再刷新mv5。

对于级联向上刷新,会先找到所有依赖mv5的物化视图,然后从底层向上层,逐层进行物化视图刷新。

级联刷新流程:先刷新mv5,再刷新mv6。

定时刷新物化视图

对于后台定时刷新的物化视图,需要用户指定刷新方式,否则都采用默认的刷新方式,而不会进行级联刷新。

因此针对类物化视图,支持在创建时指定级联刷新方式,支持修改级联刷新方式。

示例:

  1. 创建定时刷新物化视图。
    CREATE TABLE test_table(a int2, b int, c int8, d int) WITH (ORIENTATION = COLUMN, COLVERSION = 2.0) DISTRIBUTE BY hash(c);
    create materialized view mv_test_sync_default REFRESH START WITH('2020-01-01 12:12:12'::timestamptz) EVERY (interval '1 s')  ENABLE QUERY REWRITE as
    select  a,sum(b) b from test_table group by a;
    create materialized view mv_test_sync_restrict REFRESH restrict START WITH('2020-01-01 12:12:12'::timestamptz) EVERY (interval '1 s') ENABLE QUERY REWRITE as
    select  a,sum(b) b from test_table group by a;
    create materialized view mv_test_sync_forward REFRESH cascade forward START WITH('2020-01-01 12:12:12'::timestamptz) EVERY (interval '1 s') ENABLE QUERY REWRITE as
    select  a,sum(b) b from test_table group by a;
    create materialized view mv_test_sync_backward REFRESH cascade backward START WITH('2020-01-01 12:12:12'::timestamptz) EVERY (interval '1 s') ENABLE QUERY REWRITE as
    select  a,sum(b) b from test_table group by a;
    create materialized view mv_test_sync_all REFRESH cascade all START WITH('2020-01-01 12:12:12'::timestamptz) EVERY (interval '1 s') ENABLE QUERY REWRITE as
    select  a,sum(b) b from test_table group by a;
  2. 查看定时刷新任务。
    SELECT what, category_id, is_broken, interval FROM scheduler.pg_task WHERE what LIKE '%mv_test%' ORDER BY 1;

  3. 修改级联刷新方式。
    ALTER MATERIALIZED VIEW mv_test_sync_backward REFRESH START WITH('2020-01-01 15:15:15'::timestamptz) EVERY (interval '10 s') ;
    ALTER MATERIALIZED VIEW mv_test_sync_restrict REFRESH cascade all START WITH('2020-01-01 12:12:12'::timestamptz) EVERY (interval '20 s') ;
    ALTER MATERIALIZED VIEW mv_test_sync_all REFRESH  default;
    ALTER MATERIALIZED VIEW mv_test_sync_forward REFRESH default START WITH('2020-01-01 12:12:12'::timestamptz) EVERY (interval '50 s') ;

相关文档