更新时间:2025-09-19 GMT+08:00
分享

物化视图

物化视图简介

物化视图是一种特殊的物理表,与视图的区别是物化视图存储了查询结果,而不是查询的定义。相比视图物化视图在查询时有更高的速度,但物化视图无法实时更新,对于需要实时响应的业务不够灵活。物化视图又分为增量物化视图和全量物化视图。

  • 全量物化视图:全量物化视图需要刷新时,会对视图进行全量更新,即重新执行查询并将结果替换到当前视图中。适用于数据更新频率较低,查询成本较高的场景,因为全量物化视图刷新成本较高,不适合频繁更新的场景。
  • 增量物化视图:增量物化视图允许对视图进行增量更新,即只更新上次刷新后发生变化的数据。适用于刷新频率较高的场景。虽然增量物化视图刷新成本较低,但是支持的场景较少(例如增量物化视图目前不支持聚合函数)目前仅支持简单过滤查询和基表UNION ALL。

示例

  • 全量物化视图
    --建表及插入数据(全量物化视图只支持基表是Astore)。
    gaussdb=# CREATE TABLE tb_test(pid varchar(5),snum varchar(5)) WITH (storage_type = astore);
    NOTICE:  The 'DISTRIBUTE BY' clause is not specified. Using 'pid' as the distribution column by default.
    HINT:  Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column.
    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;
    NOTICE:  The 'DISTRIBUTE BY' clause is not specified. Using 'pid' as the distribution column by default.
    HINT:  Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column.
    INSERT 0 2
    
    
    --查询全量物化视图。
    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;
    INSERT 0 2
    
    --查询全量物化视图。
    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);
    NOTICE:  The 'DISTRIBUTE BY' clause is not specified. Using 'c1' as the distribution column by default.
    HINT:  Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column.
    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

相关文档