# 刷新分区物化视图
当创建成功分区物化视图时，可以使用分区刷新减少刷新代价。
#### 自动刷新
- 由系统内部识别自动刷新，通过以下命令刷新。
  ```
  REFRESH MATERIALIZED VIEW materialized_view_name;
  ```
  该命令会尝试刷新物化视图，如果满足分区刷新的条件则进行分区刷新，否则转为全量刷新。
  
- 设置GUC参数[mv_refresh_parts_per_trans](https://support.huaweicloud.com/devg-911-dws/dws_04_0936.html#ZH-CN_TOPIC_0000002202095025__section32246529252)（该参数9.1.1.200及以上集群版本支持），可实现分区由近及远的分批刷新和提交，先刷最新分区，保证最新分区的时效性。推荐按分区访问的业务场景开启此参数。
- 并发与冲突，当自动刷新时遇到当前分区正在被刷新，会自动跳过当前分区，避免重复浪费计算资源。
 
#### 手动刷新指定分区
通过以下命令指定需要刷新的物化视图分区。
```
REFRESH MATERIALIZED VIEW materialized_view_name PARTITION (partname1,partname2);
```
该命令会尝试刷新物化视图分区partname1，partname2，如果当前分区不需要刷新，则不会刷新，并会提示数据为最新。
#### 强制手动刷新指定分区
通过以下命令强制刷新物化视图指定分区。
```
REFRESH MATERIALIZED VIEW materialized_view_name PARTITION (partname) RESTRICT;
```
#### 查看分区物化视图
查看分区的数据是否更新。
通过pg_matview_partition的active字段可以查看当前分区是否已更新。
```
\d  pg_matview_partition;
Table "pg_catalog.pg_matview_partition"
      Column        |           Type           | Modifiers
--------------------+--------------------------+-----------
matpartid           | oid                      | not null
active              | boolean                  | not null
refresh_start_time  | timestamp with time zone | not null
refresh_finish_time | timestamp with time zone | not null
```
字段含义如下：
- matpartid，表示物化视图分区OID
- active，表示当前分区是否已更新。 t表示已更新，f表示失效。
- refresh_start_time，表示最后一次分区刷新开始时间。
- refresh_finish_time，表示最后一次分区刷新结束时间。
 
#### 示例
1. 创建时间上卷物化视图level_month并查看视图信息。 
   ```
   CREATE MATERIALIZED VIEW level_month enable query rewrite
   DISTRIBUTE BY HASH(start_time)
   PARTITION BY date_trunc('month', start_time)
   AS SELECT fact_table.start_time, dimen_table.id FROM fact_table JOIN dimen_table ON fact_table.id = dimen_table.id;
   ```
   ```
   SELECT * FROM pg_matview_partition;
   matpartid | active |      refresh_start_time       |      refresh_finish_time
   ----------+--------+-------------------------------+-------------------------------
      17092  | t      | 2024-11-18 15:15:32.177697+08 | 2024-11-18 15:15:32.204009+08
      17093  | t      | 2024-11-18 15:15:32.177697+08 | 2024-11-18 15:15:32.204009+08
      17094  | t      | 2024-11-18 15:15:32.177697+08 | 2024-11-18 15:15:32.204009+08
      17095  | t      | 2024-11-18 15:15:32.177697+08 | 2024-11-18 15:15:32.204009+08
      17096  | t      | 2024-11-18 15:15:32.177697+08 | 2024-11-18 15:15:32.204009+08
   ```
   
   
2. 向基表插入数据。 
   ```
   INSERT INTO fact_table (start_time, id) VALUES ('2023-05-01',1);
   ```
   
   
3. 查看分区失效情况。 
   ```
   SELECT * FROM pg_matview_partition;
   matpartid | active |      refresh_start_time       |      refresh_finish_time
   ----------+--------+-------------------------------+-------------------------------
      17092  | f      | 2024-11-18 15:15:32.177697+08 | 2024-11-18 15:15:32.204009+08
      17093  | t      | 2024-11-18 15:15:32.177697+08 | 2024-11-18 15:15:32.204009+08
      17094  | t      | 2024-11-18 15:15:32.177697+08 | 2024-11-18 15:15:32.204009+08
      17095  | t      | 2024-11-18 15:15:32.177697+08 | 2024-11-18 15:15:32.204009+08
      17096  | t      | 2024-11-18 15:15:32.177697+08 | 2024-11-18 15:15:32.204009+08
   ```
   
   
4. 刷新物化视图。 
   ```
   REFRESH MATERIALIZED VIEW level_month;
   ```
   由于只是分区失效，则会触发分区刷新。
   
   
5. 查看刷新后的状态。 
   ```
   SELECT * FROM pg_matview_partition;
   matpartid | active |      refresh_start_time       |      refresh_finish_time
   ----------+--------+-------------------------------+-------------------------------
     17093   | t      | 2024-11-18 15:15:32.177697+08 | 2024-11-18 15:15:32.204009+08
     17094   | t      | 2024-11-18 15:15:32.177697+08 | 2024-11-18 15:15:32.204009+08
     17095   | t      | 2024-11-18 15:15:32.177697+08 | 2024-11-18 15:15:32.204009+08
     17096   | t      | 2024-11-18 15:15:32.177697+08 | 2024-11-18 15:15:32.204009+08
     17092   | t      | 2024-11-18 15:16:28.902902+08 | 2024-11-18 15:16:28.940159+08
   ```
   
   
 
