
# 物化视图
#### 物化视图简介
物化视图是一种特殊的物理表，与视图的区别是物化视图存储了查询结果，而不是查询的定义。相比视图物化视图在查询时有更高的速度，但物化视图无法实时更新，对于需要实时响应的业务不够灵活。物化视图又分为增量物化视图和全量物化视图。
- 全量物化视图：全量物化视图需要刷新时，会对视图进行全量更新，即重新执行查询并将结果替换到当前视图中。适用于数据更新频率较低，查询成本较高的场景，因为全量物化视图刷新成本较高，不适合频繁更新的场景。
- 增量物化视图：增量物化视图允许对视图进行增量更新，即只更新上次刷新后发生变化的数据。适用于刷新频率较高的场景。虽然增量物化视图刷新成本较低，但是支持的场景较少（例如增量物化视图目前不支持聚合函数）目前仅支持简单过滤查询和基表UNION ALL。
 
#### 示例
- 全量物化视图
  ```
  --建表及插入数据(全量物化视图只支持基表是Astore)。
  gaussdb=# CREATE TABLE tb_test(pid varchar(5),snum varchar(5)) WITH (storage_type = astore);
  CREATE TABLE
  gaussdb=# INSERT INTO tb_test VALUES ('00001','aaaaa');
  INSERT 0 1
  gaussdb=# INSERT INTO tb_test VALUES ('00001','aacba');
  INSERT 0 1
  gaussdb=# INSERT INTO tb_test VALUES ('00002','badbc');
  INSERT 0 1
  --创建全量物化视图。
  gaussdb=# CREATE MATERIALIZED VIEW mv_test AS SELECT pid,count(snum) cnt FROM tb_test GROUP BY pid;
  CREATE MATERIALIZED VIEW
  --查询全量物化视图。
  gaussdb=# SELECT * FROM mv_test;
    pid  | cnt 
  -------+-----
   00002 |   1
   00001 |   2
  (2 rows)
  --插入数据后继续查询全量物化视图。
  gaussdb=# INSERT INTO tb_test VALUES ('00002','bdacc');
  INSERT 0 1
  --查询结果没有变化，物化视图需要手动刷新。
  gaussdb=# SELECT * FROM mv_test;
    pid  | cnt 
  -------+-----
   00002 |   1
   00001 |   2
  (2 rows)
  --刷新全量物化视图。
  gaussdb=# REFRESH MATERIALIZED VIEW mv_test;
  REFRESH MATERIALIZED VIEW
  --查询全量物化视图。
  gaussdb=# SELECT * FROM mv_test;
    pid  | cnt 
  -------+-----
   00002 |   2
   00001 |   2
  (2 rows)
  --删除表和物化视图。
  gaussdb=# DROP MATERIALIZED VIEW mv_test;
  DROP MATERIALIZED VIEW
  gaussdb=# DROP TABLE tb_test;
  DROP TABLE
  ```
  
- 增量物化视图
  ```
  --创建表。
  gaussdb=# CREATE TABLE tb_test(c1 int) WITH (storage_type = astore);
  CREATE TABLE
  --增量物化视图中包含聚合函数报错。
  gaussdb=# CREATE INCREMENTAL MATERIALIZED VIEW imv_test AS SELECT count(*) FROM tb_test;
  ERROR:  Feature not supported
  DETAIL:  aggregates on incremental materialized view creation
  --创建增量物化视图。
  gaussdb=# CREATE INCREMENTAL MATERIALIZED VIEW imv_test AS SELECT * FROM tb_test;
  CREATE MATERIALIZED VIEW
  --增量刷新增量物化视图。
  gaussdb=# REFRESH INCREMENTAL MATERIALIZED VIEW imv_test;
  REFRESH MATERIALIZED VIEW
  --全量刷新增量物化视图。
  gaussdb=# REFRESH MATERIALIZED VIEW imv_test;
  REFRESH MATERIALIZED VIEW
  --删除表和物化视图。
  gaussdb=# DROP MATERIALIZED VIEW imv_test;
  DROP MATERIALIZED VIEW
  gaussdb=# DROP TABLE tb_test;
  DROP TABLE
  ```
  
 
