【问题标题】:performance of refreshing postgres materialized view刷新postgres物化视图的表现
【发布时间】:2020-12-03 19:11:16
【问题描述】:

我正在探索物化视图以创建非规范化视图以避免连接多个表以提高读取性能。 API 将从物化视图中读取数据以向客户端提供数据。

我正在使用 amazon aurora postgres(版本 11)。

我在物化视图 (MV) 上使用唯一索引,以便我可以使用“同时刷新”选项。

但我注意到的是,当一个源表中只有一小部分行得到更新并且我尝试刷新视图时,它的速度非常慢。实际上比第一次填充视图要慢。例如:第一次填充 MV 大约需要 30 分钟,刷新需要一个多小时。不到 1% 的行已更新。生成 MV 所涉及的主要三个表有大约 1800 万、2700 万和 4000 万行。

物化视图刷新的及时性很重要,这样数据不会过时太久。

我可以使用自定义表来存储非规范化数据而不是物化视图,但必须实现逻辑来刷新数据。所以计划尽可能避免这种情况。

有什么办法可以加快物化视图的刷新过程?

如果您需要更多详细信息,请告诉我。

谢谢 基兰

【问题讨论】:

    标签: postgresql amazon-aurora


    【解决方案1】:

    您可以创建第二个物化视图并更新它(不是同时),然后将名称交换到事务中的表。

    我实际上不知道为什么 postgres 没有以这种方式同时实现。

    【讨论】:

    • 这样做是为了没有死元组
    • 这仅在您没有从要替换的视图中选择另一个 [物化] 视图时才有效。从属视图指的是对象,而不是对象的名称。因此,当您交换名称时,依赖视图不会引用新交换的视图。您还必须找到并替换所有依赖视图。
    【解决方案2】:

    即使变化不大,刷新物化视图也很慢,因为每次刷新视图时,都会运行定义查询。

    使用CONCURRENTLY会使操作更慢,因为它不是对物化视图内容的全面替换,而是对现有数据的修改。

    也许您可以创建一个非规范化表,只要基础表被修改,它就会由触发器更新。

    【讨论】:

    • 感谢您提供的信息,我假设您指的是语句触发器。(postgresql.org/docs/11/…)。将探索该选项。
    • 可以是行级触发器或带有转换表的语句级触发器。
    猜你喜欢
    • 2018-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-15
    • 1970-01-01
    • 2015-10-10
    • 2019-10-11
    相关资源
    最近更新 更多