← 中文资源

简体中文版本

在不阻塞读取的情况下刷新物化视图

为昂贵聚合建立物化视图,采用并发刷新,并管理并发刷新所需的唯一索引。

阅读英文原文

概述

每次加载都重算昂贵聚合会把成本推给生产库,并在运行期间给出不一致的数字。物化视图把计算一次性存下,并发刷新则让读取在整个刷新过程中继续。

关键步骤

  1. 用昂贵查询创建物化视图。
  2. 添加唯一索引,使 CONCURRENTLY 刷新成为可能。
  3. 按计划用 CONCURRENTLY 刷新。
  4. 记录陈旧窗口,并监控刷新时长与失败。

验证

  • 刷新期间读取不受阻塞。
  • 缺少唯一索引时并发刷新会失败。
  • 消费方知晓数据可能的最大陈旧度。
  • 刷新失败可被监控发现。

注意事项

  • 物化视图按设计提供陈旧数据,读取必须反映最新写入时不适用。
  • 并发刷新更慢,且需要唯一索引与足够的空闲空间。

适用范围

本条目围绕「在不阻塞读取的情况下刷新物化视图」给出可复制的步骤、验证方式与常见问题,适合需要按此流程落地的工程团队。执行时请结合自身上下文调整命令与阈值,并在变更前后留存证据,便于后续复核与回滚。

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;