【问题标题】:POSTGRESQL Refresh materialized views CONCURRENTLYPOSTGRESQL CONCURRENTLY 刷新物化视图
【发布时间】:2022-08-09 23:48:02
【问题描述】:

如何加快简单物化视图的刷新 create materialized view some_name as select * from some_heavy_table WITH DATA 如果同时刷新需要很长时间?

  • CONCURRENTLY 是关于不阻止其他连接速度不快的连接。如果您想以阻塞并发选择为代价更快地删除CONCURRENTLY
  • 不幸的是,我们的目标是通过同时使用刷新来防止数据库中的块。但它对 50 GB 表的工作时间很长
  • 你不能两者兼得。一切都是权衡。 CONCURRENTLY 的权衡是时间。选一个.
  • 为什么不直接查询 50GB 的表呢?
  • 您的问题与“如何使我的数据库更快”一样无法回答。它缺少定义、度量和执行计划等细节。

标签: postgresql materialized-views


【解决方案1】:

来自 Postgres source 代码:

并发刷新在临时表空间中构建新数据,并做 diff

所以同时刷新一个物化视图需要更多的时间,因为还有更多的工作要做。它不仅要更换表,还必须检查新旧之间的差异并进行更新。在这两种情况下,都需要计算来自查询的数据,但是没有办法解决这个问题,而且使用“并发”与不使用基本上没有区别。

但是,除非您使用“并发”,否则任何取决于可用物化视图的内容都会被阻止。因此,如果您有一个长时间运行的刷新,同时执行它可能是有益的。这将花费更多时间,但对物化视图的其他用户的影响较小。

但是,如果您的目标是尽快完成,则不应同时使用。

【讨论】:

    【解决方案2】:

    在数据库Materialized Views 上,仅当您的查询执行很长时间时才这样做。它经常用于报告。物化视图如何工作? 当您创建物化视图时,数据库首先执行一次您的查询,并将返回数据存储在内部系统隐藏表中。下次我们将使用此视图时,DB 将用于存储在系统表中的数据。这就是为什么下次我们的查询会非常非常快地返回数据。有些人在选择视图进程时总是使用Refresh Materialized。这不是正确的方法。在这种情况下,使用物化是没有意义的。请注意,如果您在物化视图中使用的表上的数据将被更新,那么您无法选择物化视图来查看更新数据。因为物化视图被执行并且只计算一次。因此,为了查看新数据,我们可以使用refresh materialized 命令进行物化刷新。因此,建议仅对不经常更新的表使用物化。因此,建议在一天中使用作业(或计划脚本)刷新一次具体化视图。第二种方法是,你可以想出一些刷新的机制或逻辑过程。例如:当您的数据更新时,我们可以将日志数据插入到我们的日志表中,以便我们了解此更新过程。并且在选择物化视图之前我们必须检查我们的日志表,当我们在日志表上查看更新的进程记录时,我们必须先执行refresh materialized,然后才能使用这个视图。

    【讨论】:

    • 谢谢您的回答。我们了解 mat.view 的目的,但有关速度的主要问题仍在议程上。
    猜你喜欢
    • 2019-02-24
    • 1970-01-01
    • 2021-01-09
    • 1970-01-01
    • 1970-01-01
    • 2020-06-24
    • 2016-07-31
    • 2021-10-14
    • 2014-07-11
    相关资源
    最近更新 更多