Ответ
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. - Дополнительное дисковое пространство: Хранит копию данных.
Идеальный сценарий: Отчеты, дашборды, кэширование результатов тяжелых агрегаций, где допустима задержка в обновлении данных.