如何对 PostgreSQL 物化视图进行增量刷新?

Gab*_*lla 10 postgresql materialized-view

我正在查看 PostgreSQL 文档,其中:

REFRESH MATERIALIZED VIEW 完全取代了物化视图的内容。旧内容被丢弃。

但是,从 9.5 开始,我相信有一种方法可以更新 MV,而无需重新生成所有数据。

Eva*_*oll 13

没有INCREMENTAL,很简单..来自文档

REFRESH MATERIALIZED VIEW [ CONCURRENTLY ] name
    [ WITH [ NO ] DATA ]
Run Code Online (Sandbox Code Playgroud)

也许您将其与CONCURRENTLY并发(锁定)而不是最小化更新混淆了。

刷新物化视图而不锁定物化视图上的并发选择。如果没有此选项,影响大量行的刷新将倾向于使用更少的资源并更快地完成,但可能会阻止试图从物化视图读取的其他连接。在受影响的行数较少的情况下,此选项可能会更快。

如果您需要增量刷新,请使用表来存储结果并将其与源连接,仅插入以下行NOT EXISTS

INSERT INTO materialized_resultset
SELECT foo,bar,baz
FROM src
WHERE NOT EXISTS (
  SELECT 1
  FROM materialized_resultset AS mr
  WHERE src.foo = mr.foo
);
Run Code Online (Sandbox Code Playgroud)

或使用较新的ON CONFLICT UPDATEON CONFLICT DO NOTHINGINSERT.

  • 如果您寻求的好处是“增量刷新”,即您根本无法做到,则有一个主要缺点。;) (2认同)