postgresql 刷新postgres示例化视图的性能

1dkrff03  于 2023-01-05  发布在  PostgreSQL
关注(0)|答案(3)|浏览(334)

我正在研究实体化视图以创建非规范化视图,从而避免为了读取性能而联接多个表。API将从实体化视图读取数据以向客户端提供数据。
我正在使用亚马逊极光postgres(版本11)。
我在物化视图(MV)上使用了唯一索引,这样我就可以使用“refresh concurrently”选项。
不过我注意到,当只有一小部分行在源表中更新时,当我尝试刷新视图时,它会非常慢。事实上,比第一次填充视图还要慢。例如:第一次填充MV需要大约30分钟,刷新需要一个多小时。2只有不到1%的行被更新。3生成MV涉及的三个主要表分别有大约1800万、2700万和4000万行。
实体化视图刷新的及时性非常重要,这样数据才不会过时太久。
我可以使用定制表来存储非规范化的数据,而不是物化视图,但是必须实现刷新数据的逻辑,因此计划尽可能避免这种情况。
有什么方法可以加快示例化视图的刷新过程吗?
如果你需要更多的细节,请告诉我。
谢谢基兰

htrmnn0y

htrmnn0y1#

您可以创建第二个物化视图并更新它(不是同时),然后names.to在事务中交换www.example.com的表。
实际上,我不知道为什么postgres没有以这种方式并发地实现。

ctzwtxfj

ctzwtxfj2#

刷新示例化视图非常慢,即使更改很少,因为每次刷新视图时,都要运行定义查询。
使用CONCURRENTLY会使操作更慢,因为它不是对实体化视图内容的大规模替换,而是对现有数据的修改。
也许您可以创建一个非规范化表,每当基础表被修改时,触发器就会更新该表。

yhqotfr8

yhqotfr83#

也许我有点晚了,但如果你想在postgres 13或更晚,你可以试试这个分机:https://github.com/sraoss/pg_ivm
他们有一些限制,但承诺更快的重建时间。
以下是pganalyze的更多信息:https://pganalyze.com/blog/5mins-postgres-15-beta1-incremental-materialized-views-pg-ivm(与项目作者相反,他们希望您使用v14或更高版本)

相关问题