Возможно ли частично обновить материализованное представление в PostgreSQL?

В Oracle можно обновить только часть данных. Но в PostgreSQL материализованные представления поддерживаются с 9.3 (текущая версия сейчас), что не так долго. Поэтому мне интересно: возможно ли обновить только часть данных в материализованном виде в PostgreSQL 9.3? Если да, как это сделать?

Ответы

Ответ 1

PostgreSQL не поддерживает прогрессивные/частичные обновления материализованных представлений.

9.4 добавляет REFRESH MATERIALIZED VIEW CONCURRENTLY, но он все равно должен быть полностью восстановлен.

Надеюсь, мы увидим поддержку в 9.5, если кто-то достаточно восторжен. Это возможно только для определенных пользовательских триггеров/правил для простых материализованных представлений, и потребуется специальная поддержка для обработки таких вещей, как инкрементное обновление count(...) ... GROUP BY ....

Ответ Oracle, на который вы ссылаетесь, на самом деле не является инкрементным обновлением. Он обновляет разделы. Чтобы PostgreSQL поддерживал это изначально, сначала нужно было поддерживать реальное декларативное разбиение, чего нет, хотя мы обсуждаем, можно ли это сделать для 9.5.

Ответ 2

Я столкнулся с подобной проблемой. Изучая Крэйг ответ, что это невозможно, я использовал обходное решение. Я деконструировал материализованный вид и соединил отдельные части в VIEW:

  • Создайте MATERIALIZED VIEW для каждого рассматриваемого столбца (material_col1, material_col2 и т.д.), используя общий столбец id.
  • Используйте обычный VIEW (fake_materialized_view), соединяющий таблицы MATERIALIZED VIEW в столбце id
  • REFRESH MATERIALIZED VIEW по мере необходимости
  • Вместо этого используйте fake_materialized_view

VIEW выглядит примерно так:

CREATE VIEW fake_materialized_view AS 
  SELECT m1.id, m1.col1, m2.col2
  FROM material_col1 as m1 LEFT JOIN 
       material_col2 as m2 
         ON m1.id = m2.id;