域名 AXUM.RS 将于2025年10月到期。我们无意再对其进行续费,我们希望你能够接续这个域名,让更多 AXUM 开发者继续受益。
  • 方案1️⃣AXUM.RS 域名 = 3000
  • 方案2️⃣方案1️⃣ + 本站所有专题原始 Markdown 文档 = 5000
  • 方案3️⃣方案2️⃣ + 本站原始数据库 = 5500
如果你有意接续这份 AXUM 情怀,请与我们取得联系。
说明:
  1. 如果有人购买 AXUM.RS 域名(方案1️⃣),或者该域名到期,本站将启用新的免费域名继续提供服务。
  2. 如果有人购买了 AXUM.RS 域名,且同时购买了内容和/或数据库(方案2️⃣/方案3️⃣),本站将关闭。届时我们或许会以另一种方式与你再相遇。

物化视图

本章将讨论 PostgreSQL 的物化视图。它可以用来缓存复杂且昂贵的查询结果,并允许你定期刷新此结果。

和普通视图不一样,物化视图允许将查询结果存储在物理磁盘上,并定期更新数据。

PostgreSQL 进视图的概念进行了扩展,允许视图物理存储数据,这就是物化视图。

物化视图可以用来缓存复杂且昂贵的查询结果,并允许你定期刷新此结果。它在许多需要快速数据访问的情况下很有用,因此它通常用于数据仓库和商业智能应用程序。

CREATE MATERIALIZED VIEW 视图名
AS
查询
WITH [NO] DATA;
  • WITH DATA:在创建时将数据加载到视图中。
  • WITH NO DATA:在创建时不将数据加载到视图中。此种情况下,在将数据加载到视图之前,无法从视图中查询数据。

刷新物化视图的数据

要将数据加载到物化视图中,请使用 REFRESH MATERIALIZED VIEW语句:

REFRESH MATERIALIZED VIEW [CONCURRENTLY] 视图名;

删除物化视图

DROP MATERIALIZED VIEW 视图名;

示例

以下语句创建一个名为 rental_by_category 的物化视图:

CREATE MATERIALIZED VIEW rental_by_category
AS
 SELECT c.name AS category,
    sum(p.amount) AS total_sales
   FROM (((((payment p
     JOIN rental r ON ((p.rental_id = r.rental_id)))
     JOIN inventory i ON ((r.inventory_id = i.inventory_id)))
     JOIN film f ON ((i.film_id = f.film_id)))
     JOIN film_category fc ON ((f.film_id = fc.film_id)))
     JOIN category c ON ((fc.category_id = c.category_id)))
  GROUP BY c.name
  ORDER BY sum(p.amount) DESC
WITH NO DATA;

由于我们使用的是 WITH NO DATA选项,所以该视图创建完之后,你无法从中查询数据。此时需要将数据加载到该视图中:

此时,再查询数据,就能得到预期的结果:

SELECT * FROM rental_by_category;

如果在刷新数据的时候,要使用 CONCURRENTLY 选项,那么需要为这个视图创建一个 UNIQUE 索引,比如:

现在可以放心地使用 CONCURRENTLY选项刷新数据了:

REFRESH MATERIALIZED VIEW CONCURRENTLY rental_by_category;
要查看完整内容,请先登录