postgresql 9.5 - 在父级同时刷新时锁定子级物化 View

标签 postgresql concurrency postgresql-9.5

我有一个物化 View ,它依赖于其他几个物化 View 。

matviewA matviewB matviewC
    \       |       /
         matviewX

我想做的是同时刷新父物化 View 。 (这并不是真正的问题 - 如下所示。) [在我当前的环境中,每个家长大约需要一个小时来刷新。 ]

psql -c "refresh materialized view concurrently matviewA" &
psql -c "refresh materialized view concurrently matviewB" &
psql -c "refresh materialized view concurrently matviewC" &

但是,如果我开始对 child 进行刷新:

psql -c "refresh materialized view concurrently matviewX" &

它会立即运行,不会等待 parent 完成刷新,因为当他们自己已经同时刷新时,他们不会锁定 child 进行刷新。

我尝试在 parent 运行时给 child 加锁:

psql -c "lock matviewX in share mode; refresh materialized view concurrently matviewA" &
psql -c "lock matviewX in share mode; refresh materialized view concurrently matviewB" &
psql -c "lock matviewX in share mode; refresh materialized view concurrently matviewC" &

不幸的是,您无法对物化 View 施加显式锁定。

如果我不在父级上使用“并发”,则子物化 View 将变得不可读。 (但是子刷新在运行之前会等待。)

我可以在调用“psql -c”的(bash)包装脚本中编写一些锁管理。或者我可以使用更复杂的第三方作业调度程序。我希望有一种更简单的方法。

我也许可以编写一个函数并将所有刷新放入该函数中,然后使用临时表进行手动显式锁定管理。

或者也许以某种方式使用咨询锁。

建议?

最佳答案

您可以简单地使用wait(请参阅https://stackoverflow.com/a/18663969/3886053):

for parent in matviewA matviewB matviewC; do
  psql -c "refresh materialized view concurrently $parent" &
  echo "Started refreshing materialized view $parent"
done
echo -n "Waiting for all parents to finish... "
wait
echo "finished. Refreshing now the child materialized view"
psql -c "refresh materialized view concurrently matviewX"

关于postgresql 9.5 - 在父级同时刷新时锁定子级物化 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38235524/

相关文章:

ios - 如何在swift中实现平行 map

postgresql - 错误: invalid input syntax for type numeric: “N/A” … nice but which column?

java - 使用 JDBC 将 CSV 复制到带有自定义类型数组的 Postgres

arrays - Postgres 将数组转换为自定义类型

Java - 确定用户输入\n和按html形式按回车之间的区别

json - 我应该如何从 bradjasper 的 django-jsonfield 升级到 Django 的内置 jsonfield?

java - 两个线程,同一个静态变量,同一个值,并发访问

go - 如何使用 channel 对 golang 管道阶段中的项目进行批处理?

sql - 如何确定几何区域内的平均停留时间

php - 我应该如何从 PostgreSQL 下的一系列时间段中找到列的总和?