刷新嵌套物化视图
级联刷新
嵌套物化视图中,为了避免单个物化视图刷新繁琐操作,支持自动级联刷新嵌套物化视图。
当前支持五种刷新方式,默认、强制、级联向上、级联向下和全部级联。即对应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。
定时刷新物化视图
对于后台定时刷新的物化视图,需要用户指定刷新方式,否则都采用默认的刷新方式,而不会进行级联刷新。
因此针对类物化视图,支持在创建时指定级联刷新方式,支持修改级联刷新方式。
示例:
- 创建定时刷新物化视图。
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;
- 查看定时刷新任务。
SELECT what, category_id, is_broken, interval FROM scheduler.pg_task WHERE what LIKE '%mv_test%' ORDER BY 1;
- 修改级联刷新方式。
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') ;