和普通视图不一样,物化视图允许将查询结果存储在物理磁盘上,并定期更新数据。
你应该知道,普通视图是以虚拟表的形式表示基础表的数据的,虽然不推荐,但普通视图的数据也可以更新。
PostgreSQL 进视图的概念进行了扩展,允许视图物理存储数据,这就是物化视图。
物化视图可以用来缓存复杂且昂贵的查询结果,并允许你定期刷新此结果。它在许多需要快速数据访问的情况下很有用,因此它通常用于数据仓库和商业智能应用程序。
创建物化视图
CREATE MATERIALIZED VIEW 视图名
AS
查询
WITH [NO] DATA;
WITH DATA
:在创建时将数据加载到视图中。WITH NO DATA
:在创建时不将数据加载到视图中。此种情况下,在将数据加载到视图之前,无法从视图中查询数据。
刷新物化视图的数据
要将数据加载到物化视图中,请使用 REFRESH MATERIALIZED VIEW
语句:
REFRESH MATERIALIZED VIEW [CONCURRENTLY] 视图名;
- 在刷新物化视图的数据时,PostgreSQL 会锁定整张表。要避免这种情况,可以使用
CONCURRENTLY
选项。 CONCURRENTLY
选项的一个要求是,物化视图必须具有UNIQUE
索引。
删除物化视图
DROP MATERIALIZED VIEW 视图名;
示例
以下语句创建一个名为 rental_by_category
的物化视图:
由于我们使用的是 WITH NO DATA
选项,所以该视图创建完之后,你无法从中查询数据。此时需要将数据加载到该视图中:
REFRESH MATERIALIZED VIEW rental_by_category;
此时,再查询数据,就能得到预期的结果:
如果在刷新数据的时候,要使用 CONCURRENTLY
选项,那么需要为这个视图创建一个 UNIQUE
索引,比如:
CREATE UNIQUE INDEX rental_category ON rental_by_category (category);
现在可以放心地使用 CONCURRENTLY
选项刷新数据了:
REFRESH MATERIALIZED VIEW CONCURRENTLY rental_by_category;