并发刷新物化视图
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:如果我正确理解刷新并发机制,数据将恢复到临时表中,然后切换新旧表。为什么需要创建唯一索引?以上是关于并发刷新物化视图的主要内容,如果未能解决你的问题,请参考以下文章