概述
每次加载都重算昂贵聚合会把成本推给生产库,并在运行期间给出不一致的数字。物化视图把计算一次性存下,并发刷新则让读取在整个刷新过程中继续。
关键步骤
- 用昂贵查询创建物化视图。
- 添加唯一索引,使 CONCURRENTLY 刷新成为可能。
- 按计划用 CONCURRENTLY 刷新。
- 记录陈旧窗口,并监控刷新时长与失败。
验证
- 刷新期间读取不受阻塞。
- 缺少唯一索引时并发刷新会失败。
- 消费方知晓数据可能的最大陈旧度。
- 刷新失败可被监控发现。
注意事项
- 物化视图按设计提供陈旧数据,读取必须反映最新写入时不适用。
- 并发刷新更慢,且需要唯一索引与足够的空闲空间。
适用范围
本条目围绕「在不阻塞读取的情况下刷新物化视图」给出可复制的步骤、验证方式与常见问题,适合需要按此流程落地的工程团队。执行时请结合自身上下文调整命令与阈值,并在变更前后留存证据,便于后续复核与回滚。
CREATE MATERIALIZED VIEW sales_daily AS
SELECT date_trunc('day', created_at) AS day, sum(total) AS revenue
FROM orders GROUP BY 1;
CREATE UNIQUE INDEX ON sales_daily (day);
REFRESH MATERIALIZED VIEW CONCURRENTLY sales_daily;