2013-09-15 3 views
7

Официальная документация PostgreSQL 9.3 на REFRESH MATERIALIZED VIEW еще не описала ее подробно.Обновить материализованные представления: Параллелия, транзакционное поведение

Цитата из этого blog:

материализованные представления в Postgres 9.3 имеют серьезные ограничения, заключающегося в использовании монопольной блокировки при обновлении его. Это в основном блокирует любые попытки читать материализованное представление в то время как она обновляется новыми данными от своих родительских отношений

Еще одна цитата из публикации в mailing list:

, если я понимаю вещи правильно ОБНОВИТЬ MATERIALIZED VIEW блокирует материализованное представление с AccessExclusiveLock, даже если в представлении уже содержатся данные.

Мой вопрос: Является ли следующая последовательность правильно:

  1. Запрос обращается материализованное представление
  2. Задание выполняет REFRESH MATERIALIZED VIEW. Он помещает блокировку в представление и ждет, пока все запущенные запросы с использованием matview не будут завершены.
  3. Матвиз начинается с обновления; если есть индекс в matview, он обновляется одновременно (так что полное обновление происходит в одной транзакции)
  4. Запросы с использованием matview ждут, пока обновление не будет завершено. Если это занимает слишком много времени, есть что-то вроде «ожидания ошибки тайм-аута блокировки».
  5. Refresh завершается, блокировка снимается
  6. запросов, которые были ждущие matview продолжают

ответ

4

Возьмите ответ с зерном соли, так как я еще играть с видом на мат, но на этом основании:

http://www.postgresql.org/docs/current/static/sql-creatematerializedview.html

философия за ними, чтобы рассматривать их как умнее вариаций create table as ...:

CREATE MATERIALIZED VIEW похож на CREATE TABLE AS, за исключением того, что он также запоминает запрос, используемый для инициализации представления, чтобы его можно было обновить позже по требованию. Материализованный вид имеет многие свойства, такие как таблица, но нет поддержки временного материализованного представления или автоматической генерации OID.

Поскольку, как я прочитал refresh materialized view команды или документы, которые я нашел на них, они не обновляются автоматически, и я понимаю, Поток так же, как и вы.

Эксклюзивный замок, я думаю, исходит из того факта, что вы не можете легко узнать (за исключением тривиальных случаев), какие строки грязны, а какие нет. Если бы разработчики определили эффективный способ сделать это, материализованное представление, вероятно, будет обновляться автоматически и одновременно.

6

Начиная с выпуска Postgres 9.4 это не совсем так. Теперь вы можете обновлять материализованное представление одновременно с помощью команды REFRESH MATERIALIZED VIEW CONCURRENTLY. Функционально это обновляет представление, но делает это без блокировки чтения. Это более дорогостоящая операция с точки зрения вычислений, но если блокировка является проблемой для вас (как это было для меня, что привело меня к этому пути), то это не плохой путь.

Вот еще некоторая информация от примечания к выпуску: https://wiki.postgresql.org/wiki/What%27s_new_in_PostgreSQL_9.4#REFRESH_MATERIALIZED_VIEW_CONCURRENTLY

Смежные вопросы