物化视图
PostgreSQL 中的物化视图是什么?
物化视图存储查询的结果,可以像表一样读取。读取速度很快,但只有在运行 REFRESH MATERIALIZED VIEW 时数据才会更新。
物化视图只运行一次其定义查询并存储结果;而普通视图在每次被读取时都会运行其查询。读取物化视图和读取表一样快,并且可以为它创建独立的索引。
存储的数据不会跟随底层表的变化而变化,只有在运行 REFRESH MATERIALIZED VIEW 时才会更新。普通刷新在执行期间会阻塞对视图的读取。使用 CONCURRENTLY 时,刷新期间仍可继续读取,这要求视图上至少有一个唯一索引,并且在只有少量行发生变化时可能更快。
示例
该示例在物化视图中按地区汇总销售额,记录一笔新的销售,然后并发刷新该视图(唯一索引使这一操作成为可能)。north 的总额只有在刷新之后才包含这笔新销售。
CREATE TABLE sales (id int PRIMARY KEY, region text, amount numeric);
INSERT INTO sales
SELECT g, (ARRAY['north', 'south', 'east'])[1 + g % 3], g % 50
FROM generate_series(1, 30000) AS g;
CREATE MATERIALIZED VIEW sales_by_region AS
SELECT region, sum(amount) AS total FROM sales GROUP BY region;
CREATE UNIQUE INDEX ON sales_by_region (region);
INSERT INTO sales VALUES (30001, 'north', 1000);
REFRESH MATERIALIZED VIEW CONCURRENTLY sales_by_region;
SELECT * FROM sales_by_region ORDER BY region;适用于原生 PostgreSQL 16 或 17 的纯 SQL,无需任何扩展。请在一个可随时丢弃的空数据库中运行。
参考资料
PostgreSQL 官方文档(英文)。