物化视图是相对普通视图而言的。普通视图是虚拟表,而物化视图实际上就是存储SQL执行语句的结果,可以直接使用数据而不用重复执行查询语句,起到缓存的效果。
按照刷新方式物化视图分为全量物化视图和增量物化视图两种:
全量物化视图:仅支持对已创建的物化视图进行全量更新,而不支持进行增量更新。创建全量物化视图语法和CREATE TABLE AS语法类似。
增量物化视图:可以对物化视图增量刷新,需要用户手动执行语句完成对物化视图在一段时间内的增量数据刷新。与全量创建物化视图的不同在于目前增量物化视图所支持场景较小。目前物化视图创建语句仅支持基表扫描语句或者UNION ALL语句。
GaussDB即支持全量物化视图也支持增量物化视图,目前Ustore引擎不支持创建、使用物化视图,物化视图是现代数据库的高级特性。目前GaussDB已经全面支持物化视图功能,有了物化视图功能,GaussDB在数据库兼容性方面又迈出了一大步,下面将介绍GaussDB全量和增量物化视图的使用。
创建全量物化视图CREATE MATERIALIZED VIEW [ view_name ] AS query;
刷新全量物化视图REFRESH MATERIALIZED VIEW [ view_name ];
删除物化视图DROP MATERIALIZED VIEW [ view_name ];
查询物化视图SELECT * FROM [ view_name ];
参数说明:
view_name:要创建的物化视图的名称。
AS query:一个SELECT、TABLE 或者VALUES命令。
--创建表和插入数据。
openGauss=# CREATE TABLE t_full(c1 int, c2 int);
openGauss=# INSERT INTO t_full VALUES(1, 1);
openGauss=# INSERT INTO t_full VALUES(2, 2);
--创建全量物化视图。
openGauss=# CREATE MATERIALIZED VIEW mv AS select count(*) from t_full;
CREATE MATERIALIZED VIEW
--查询物化视图结果。
openGauss=# SELECT * FROM mv;
count
-------
2
(1 row)
--向物化视图中基表插入数据。
openGauss=# INSERT INTO t_full VALUES(3, 3);
INSERT 0 1
--对全量物化视图做全量刷新。
openGauss=# REFRESH MATERIALIZED VIEW mv;
REFRESH MATERIALIZED VIEW
--查询物化视图结果。
openGauss=# SELECT * FROM mv;
count
-------
3
(1 row)
--删除物化视图。
openGauss=# DROP MATERIALIZED VIEW mv;
DROP MATERIALIZED VIEW
创建增量物化视图CREATE INCREMENTAL MATERIALIZED VIEW [ view_name ] AS query;
全量刷新物化视图REFRESH MATERIALIZED VIEW [ view_name ];
增量刷新物化视图REFRESH INCREMENTAL MATERIALIZED VIEW [ view_name ];
删除物化视图DROP MATERIALIZED VIEW [ view_name ];
查询物化视图SELECT * FROM [ view_name ];
view_name:要创建的物化视图的名称。
AS query:一个SELECT、TABLE 或者VALUES命令。
--创建表和插入数据。
openGauss=# CREATE TABLE t_v(c1 int, c2 int);
openGauss=# INSERT INTO t_v VALUES(1, 1);
openGauss=# INSERT INTO t_v VALUES(2, 2);
--创建增量物化视图。
openGauss=# CREATE INCREMENTAL MATERIALIZED VIEW mv AS SELECT * FROM t_v;
CREATE MATERIALIZED VIEW
--再次插入数据。
openGauss=# INSERT INTO t_v VALUES(3, 3);
INSERT 0 1
--增量刷新物化视图。
openGauss=# REFRESH INCREMENTAL MATERIALIZED VIEW mv;
REFRESH MATERIALIZED VIEW
--查询物化视图结果。
openGauss=# SELECT * FROM mv;
c1 | c2
----+----
1 | 1
2 | 2
3 | 3
(3 rows)
--再次插入数据。
openGauss=# INSERT INTO t_v VALUES(4, 4);
INSERT 0 1
--全量刷新物化视图。
openGauss=# REFRESH MATERIALIZED VIEW mv;
REFRESH MATERIALIZED VIEW
--查询物化视图结果。
openGauss=# select * from mv;
c1 | c2
----+----
1 | 1
2 | 2
3 | 3
4 | 4
(4 rows)
--删除物化视图。
openGauss=# DROP MATERIALIZED VIEW mv;
DROP MATERIALIZED VIEW
1)单表查询语句。
2)多个单表查询的UNION ALL。
3)物化视图上支持创建索引。
4)物化视图支持Analyze操作。
1)物化视图中不支持多表Join连接计划以及subquery计划。
2)除少部分ALTER操作外,不支持对物化视图中基表执行绝大多数DDL操作。
3)物化视图不支持增删改操作,只支持查询语句。
4)不支持用临时表/hashbucket/unlog/分区表创建物化视图。
5)不支持物化视图嵌套创建(即物化视图上创建物化视图)。
6)仅支持行存表,不支持列存表。
7)不支持UNLOGGED类型的物化视图,不支持WITH语法。