视图本身是一个虚表,并不包含数据,因此从视图中查询数据需要访问基表的数据。从这个角度来看视图是无法提高性能的。如果视图可以缓存数据,那么通过视图进行查询就可以提高查询的性能,这就是物化视图。物化视图与普通视图最大的区别在于:物化视图是包括一个查询结果的数据库对象,通过缓存查询结果来达到提高性能的目的。物化视图在系统目录下的信息和基础表的信息完全一样。对于解析器来说,物化视图类似于基础表和视图的关系型表。直接从物化视图中查询数据采用与基础表和视图一样的形式返回结果。
在OLAP数据库中,物化视图的作用非常大。
创建物化视图
创建物化视图与创建普通视图类似,多了一个关键字MATERIALIZED。例如:
postgres=# \d
List of relations
Schema | Name | Type | Owner
--------+------+-------+----------
public | t1 | table | postgres
(1 row)
postgres=# select * from t1;
a | b
---+-----------------
1 | 10:18:50.228834
(1 row)
--创建物化视图
postgres=# create materialized view mymatview as select * from t1;
SELECT 1
postgres=# select * from mymatview ;
a | b
---+-----------------
1 | 10:18:50.228834
(1 row)
刷新物化视图
刷新物化视图中的数据。在刷新物化视图时,会锁定整个表,因此不能执行查询表的操作,但可以通过CONCURRENTLY关键字避免锁表。使用CONCURRENTLY关键字可以创建物化视图的临时更新版本用于执行查询操作。需要注意的是,使用CONCURRENTLY关键字时,前提是物化视图应有唯一索引。 用法示例:
--插入数据
postgres=# insert into t1 values(2);
INSERT 0 1
-- 查看物化视图,因为没有刷新,看到的还是老的数据
postgres=# select * from mymatview ;
a | b
---+-----------------
1 | 10:18:50.228834
(1 row)
-- 刷新物化视图
postgres=# refresh materialized view mymatview ;
REFRESH MATERIALIZED VIEW
--可以看到新数据了
postgres=# select * from mymatview ;
a | b
---+-----------------
1 | 10:18:50.228834
2 | 10:03:55.636149
(2 rows)
-- 继续插入数据
postgres=# insert into t1 values(3);
INSERT 0 1
postgres=# select * from mymatview ;
a | b
---+-----------------
1 | 10:18:50.228834
2 | 10:03:55.636149
(2 rows)
-- 使用concurrently关键字
postgres=# refresh materialized view concurrently mymatview ;
ERROR: cannot refresh materialized view "public.mymatview" concurrently
HINT: Create a unique index with no WHERE clause on one or more columns of the materialized view.
postgres=# create unique index mymatview_unique on mymatview(a);
CREATE INDEX
postgres=# refresh materialized view concurrently mymatview ;
REFRESH MATERIALIZED VIEW
postgres=# select * from mymatview ;
a | b
---+-----------------
1 | 10:18:50.228834
2 | 10:03:55.636149
3 | 10:05:26.893624
(3 rows)
删除物化视图
删除物化视图,用法示例如下:
postgres=# drop materialized view mymatview;
DROP MATERIALIZED VIEW
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




