2017-01-23 79 views
2

我有一个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中找到的创建索引,唯一索引等,但我仍然收到了“创建唯一索引”的消息。

+0

当您逐个运行刷新时会出现此错误吗? –

+0

我以30秒的延迟一个接一个地运行它们。 –

回答

4

您将不得不在物化视图本身上创建唯一的索引。

这将看起来像这样:

CREATE UNIQUE INDEX ON productsforproject (id); 

替换id与合适的唯一键列或这些列的(逗号隔开)的组合。

+0

我已创建此索引。 “CREATE UNIQUE INDEX ON productsforproject(barcode,materialdescription ASC);”但我有消息:错误:无法同时刷新物化视图“public.productsforproject” 提示:在物化视图的一列或多列上创建一个没有WHERE子句的唯一索引。 –

+0

也许你需要指定正确的模式,比如'CREATE UNIQUE INDEX ON public.productsforproject ...'。或者你错误地在错误的数据库中创建了它。 –