postgresql - 刷新物化 View : Concurrency, 事务行为

标签 postgresql materialized-views postgresql-9.3

关于 REFRESH MATERIALIZED VIEW 的官方 PostgreSQL 9.3 文档尚未详细描述。

引自此blog :

materialized views in Postgres 9.3 have a severe limitation consisting in using an exclusive lock when refreshing it. This basically blocks any attempts to read a materialized view while it is being refreshed with new data from its parent relations

引用自 mailing list 中的一个帖子:

if I understand things correctly REFRESH MATERIALIZED VIEW locks the materialized view with an AccessExclusiveLock even if the view already contains data.

我的问题:以下顺序是否正确:

  1. 查询正在访问物化 View
  2. 作业执行REFRESH MATERIALIZED VIEW。它锁定 View ,并等待所有使用 matview 的运行查询完成
  3. matview 正在开始刷新;如果 matview 上有一个索引,它会同时更新(所以完整的刷新发生在一个事务中)
  4. 使用 matview 的查询正在等待刷新完成。如果这花费的时间太长,则会出现类似“等待锁定超时错误”的错误。
  5. 刷新完成,解除锁定
  6. 一直在等待 matview 的查询继续

最佳答案

随着 Postgres 9.4 的发布,情况并非完全如此。您现在可以使用 REFRESH MATERIALIZED VIEW CONCURRENTLY 命令并发刷新实例化 View 。从功能上讲,这会刷新 View ,但没有读锁。就计算而言,这是一个更昂贵的操作,但如果锁定对您来说是个问题(就像对我来说,这导致我走这条路),那么这不是一个坏方法。

以下是发行说明中的​​更多信息:https://wiki.postgresql.org/wiki/What%27s_new_in_PostgreSQL_9.4#REFRESH_MATERIALIZED_VIEW_CONCURRENTLY

关于postgresql - 刷新物化 View : Concurrency, 事务行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18811482/

相关文章:

python-2.7 - 尝试安装 psycopg2 模块时在 CentOS 上缺少 libpq 头文件

sql - Postgresql 忽略时间戳列上的索引,即使使用索引查询速度更快

postgresql - Postgres 图像未创建数据库

postgresql - 将物化 View 更改为常规 View

postgresql - 创建物化 View 时如何指示列不可为空?

MySQL 不使用 JOIN、WHERE 和 ORDER 的索引

json - 使用 Spring/JPA 写入 Postgres 数据库的 JSON 列

python - 如何插入分钟 :seconds format time interval to postgresql in right way?

sql - 如何使用 PostgreSQL Function() 在分隔列中返回

database - Postgresql:将不同/分组与 ORDER BY RANDOM() 结合起来