Официальная документация PostgreSQL 9.3 на REFRESH MATERIALIZED VIEW
еще не описала ее подробно.Обновить материализованные представления: Параллелия, транзакционное поведение
Цитата из этого blog:
материализованные представления в Postgres 9.3 имеют серьезные ограничения, заключающегося в использовании монопольной блокировки при обновлении его. Это в основном блокирует любые попытки читать материализованное представление в то время как она обновляется новыми данными от своих родительских отношений
Еще одна цитата из публикации в mailing list:
, если я понимаю вещи правильно ОБНОВИТЬ MATERIALIZED VIEW блокирует материализованное представление с AccessExclusiveLock, даже если в представлении уже содержатся данные.
Мой вопрос: Является ли следующая последовательность правильно:
- Запрос обращается материализованное представление
- Задание выполняет
REFRESH MATERIALIZED VIEW
. Он помещает блокировку в представление и ждет, пока все запущенные запросы с использованием matview не будут завершены. - Матвиз начинается с обновления; если есть индекс в matview, он обновляется одновременно (так что полное обновление происходит в одной транзакции)
- Запросы с использованием matview ждут, пока обновление не будет завершено. Если это занимает слишком много времени, есть что-то вроде «ожидания ошибки тайм-аута блокировки».
- Refresh завершается, блокировка снимается
- запросов, которые были ждущие matview продолжают