Что такое Materialized View в PostgreSQL?

«Что такое Materialized View в PostgreSQL?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Materialized View (материализованное представление) в PostgreSQL — это объект базы данных, который физически хранит на диске результат выполнения SQL-запроса, подобно таблице.

Ключевое отличие от обычного VIEW:

  • Обычный VIEW: Это сохраненный запрос. Данные вычисляются «на лету» при каждом обращении к VIEW.
  • Materialized View: Данные вычисляются и сохраняются в момент создания или обновления. Последующие SELECT обращаются к этим сохраненным («замороженным») данным.

Зачем это нужно? Для оптимизации производительности сложных запросов (агрегации, JOIN нескольких таблиц), результат которых используется часто, но не требует абсолютной актуальности.

Синтаксис и пример:

-- Создание материализованного представления для дорогих заказов
CREATE MATERIALIZED VIEW mv_expensive_orders AS
SELECT 
    o.id, 
    o.customer_id, 
    o.total_amount,
    c.name as customer_name
FROM orders o
JOIN customers c ON o.customer_id = c.id
WHERE o.total_amount > 1000 AND o.status = 'COMPLETED';

-- Запрос к представлению (быстро, данные берутся с диска)
SELECT * FROM mv_expensive_orders WHERE customer_name LIKE 'A%';

-- Данные устарели. Принудительное обновление (блокирует чтение).
REFRESH MATERIALIZED VIEW mv_expensive_orders;

-- Безопасное обновление (CONCURRENTLY) без блокировки чтения.
-- Требует UNIQUE-индекса на представлении.
REFRESH MATERIALIZED VIEW CONCURRENTLY mv_expensive_orders;

Преимущества:

  • Высокая скорость: Запросы выполняются мгновенно, так как обращаются к предварительно вычисленным данным.
  • Снижение нагрузки: Снимает нагрузку с исходных таблиц при частых сложных запросах.

Недостатки:

  • Устаревшие данные: Данные не обновляются автоматически. Требуется ручной или запланированный вызов REFRESH.
  • Дополнительное дисковое пространство: Хранит копию данных.

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