PostgreSQL 9.3 官方文档REFRESH MATERIALIZED VIEW尚未对其进行详细描述。
引述自此blog:
Postgres 9.3 中的物化视图有一个严重的限制,即在刷新它时使用独占锁。这基本上会阻止在使用来自其父关系的新数据刷新物化视图时读取物化视图的任何尝试
另一条引自帖子中的内容邮件列表:
如果我理解正确的话刷新物化视图会锁定
具有 AccessExclusiveLock 的物化视图,即使该视图已经存在
包含数据。
我的问题:以下顺序是否正确:
- 查询正在访问物化视图
- 作业执行
REFRESH MATERIALIZED VIEW
。它在视图上加锁,并等待所有使用 matview 运行的查询完成
- matview正在开始刷新;如果 matview 上有索引,则会同时更新(因此完整的刷新发生在一个事务中)
- 使用 matview 的查询正在等待刷新完成。如果这花费的时间太长,就会出现“等待锁定超时错误”之类的情况。
- 刷新完成,锁解除
- 一直在等待 matview 的查询继续
自 Postgres 9.4 发布以来,情况并非完全如此。您现在可以使用以下命令同时刷新物化视图REFRESH MATERIALIZED VIEW CONCURRENTLY
命令。从功能上讲,这会刷新视图,但不需要读锁。就计算而言,这是一个更昂贵的操作,但如果锁对您来说是一个问题(就像对我来说,这导致我走上这条路),那么这不是一个坏方法。
以下是发行说明中的更多信息:https://wiki.postgresql.org/wiki/What%27s_new_in_PostgreSQL_9.4#REFRESH_MATERIALIZED_VIEW_CONCURRENTLY
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)