并发刷新物化视图

Posted

技术标签:

【中文标题】并发刷新物化视图【英文标题】:Refresh materialized views with concurrency 【发布时间】:2017-06-07 19:28:11 【问题描述】:

我有一个 PostgreSQL 数据库,我在其中使用物化视图。 当我尝试刷新这些物化视图时会出现问题。

REFRESH MATERIALIZED VIEW product_cat_mview;
REFRESH MATERIALIZED VIEW productsforproject;

我的解决方案是,当用户想要查看更新的数据时,他应该点击网页上的“刷新按钮”,但这需要大约 50 秒(在本地连接上,距离应用服务器大约 2 分钟)并且所有这一次用户必须等待,这是不好的。

现在我应该创建一个解决方案,每 10 分钟自动刷新一次这些物化视图。 我创建了一个带有多线程的 Java 解决方案。但是我有一个问题。

第一个查询

REFRESH MATERIALIZED VIEW CONCURRENTLY product_cat_mview;

工作正常,但第二个

REFRESH MATERIALIZED VIEW CONCURRENTLY productsforproject;

抱怨我需要创建一个唯一索引。我尝试了在 google 中找到的创建索引、唯一索引等,但我仍然收到“创建唯一索引”的消息。

【问题讨论】:

一一运行刷新时是否会引发此错误? 我一个一个地运行它们,延迟 30 秒。 【参考方案1】:

您必须在物化视图本身上创建一个唯一索引。

看起来像这样:

CREATE UNIQUE INDEX ON productsforproject (id);

id 替换为合适的唯一键列或此类列的(逗号分隔)组合。

【讨论】:

我已经创建了这个索引。 “为项目的产品创建唯一索引(条形码,材料描述 ASC);”但我有消息:错误:无法同时刷新物化视图“public.productsforproject”提示:在物化视图的一个或多个列上创建一个没有 WHERE 子句的唯一索引。 也许您需要指定正确的架构,例如CREATE UNIQUE INDEX ON public.productsforproject ...。或者你错误地在错误的数据库中创建了它。 @LaurenzAlbe 我添加了一个唯一索引,但是当我尝试同时刷新并查询物化视图时 - 查询被卡住,直到刷新结束。有什么想法吗? 你用过CONCURRENTLY吗?也许为此打开您自己的问题,并在刷新运行时显示查询、其执行计划和 pg_locks 的内容。 @LaurenzAlbe:如果我正确理解刷新并发机制,数据将恢复到临时表中,然后切换新旧表。为什么需要创建唯一索引?

以上是关于并发刷新物化视图的主要内容,如果未能解决你的问题,请参考以下文章

oracle物化视图不会自动更新是怎么回事

如何获得oracle物化视图 定时刷新时 刷新所用的时间 或者是监控 物化视图在jobs中建立的job任务的执行时间

Oracle设置物化视图的自动刷新

PostgreSQL物化视图刷新“堆叠”

[转]物化视图创建 及 刷新机制修改

物化视图 - 识别最后一次刷新