У меня есть материализованное представление, которое зависит от нескольких других материализованных представлений.
matviewA matviewB matviewC
\ | /
matviewX
Я бы хотел обновить родительские материализованные представления одновременно все одновременно. (На самом деле это не проблема - как показано ниже.) [В моей текущей среде обновление каждого родителя занимает около часа. ]
psql -c "refresh materialized view concurrently matviewA" &
psql -c "refresh materialized view concurrently matviewB" &
psql -c "refresh materialized view concurrently matviewC" &
Однако, если я начну обновление для ребенка:
psql -c "refresh materialized view concurrently matviewX" &
Он запускается сразу и не ждет, пока родители закончат обновление, потому что они не запрещают своим детям выполнять обновления, в то время как они сами уже обновляются одновременно.
Я попытался заблокировать ребенка, пока родители бегают:
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" &
К сожалению, вы не можете явно заблокировать материализованные представления.
Если я не использую «одновременно» для родителей, дочернее материализованное представление станет нечитаемым. (Но дочернее обновление ждет перед запуском.)
Я могу написать управление блокировками в сценарии оболочки (bash), который вызывает «psql -c». Или я мог бы использовать более сложный сторонний планировщик заданий. Я надеялся, что будет более простой способ.
Я мог бы написать функцию и поместить все обновления в эту функцию, а затем использовать временную таблицу для ручного явного управления блокировками.
Или, может быть, как-нибудь использовать рекомендательные блокировки.
Предложения?