# 刷新嵌套物化视图
#### 级联刷新
嵌套物化视图中，为了避免单个物化视图刷新繁琐操作，支持自动级联刷新嵌套物化视图。
当前支持五种刷新方式，默认、强制、级联向上、级联向下和全部级联。即对应refresh_behavior取值：DEFAULT、RESTRICT、CASCADE FORWARD、CASCADE BACKWARD和CASCADE ALL。
- 默认方式：刷新单个物化视图，当物化视图的基表未发生数据变化时，不进行刷新操作，直接跳过。
- 强制方式：刷新单个物化视图。
- 级联向上：先刷新当前物化视图，然后依次刷新依赖当前物化视图的嵌套物化视图。
- 级联向下：找到当前物化视图依赖的所有物化视图，依次从最底层开始刷新，最后刷新当前物化视图。
- 全部级联：先执行级联向下刷新，再执行级联向上刷新。
 
![](https://support.huaweicloud.com/devg-911-dws/public_sys-resources/note_3.0-zh-cn.png)
级联刷新方式中，采用的是默认刷新方式，即下层物化视图/表数据未发生变化，不进行刷新操作。
示例：
以[创建嵌套物化视图](https://support.huaweicloud.com/devg-911-dws/dws_04_1427.html)中创建的嵌套物化视图为例。
对物化视图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;
   ```
   ![](https://support.huaweicloud.com/devg-911-dws/figure/zh-cn_image_0000002202095361.png "点击放大")
   
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') ;
   ```
   ![](https://support.huaweicloud.com/devg-911-dws/figure/zh-cn_image_0000002202140913.png "点击放大")
   
 
