Что такое материализованное представление в PostgreSQL
Что проверяют
Знаете ли вы, чем материализованное представление отличается от обычного, и понимаете ли цену его обновления. Для java-разработчика это ещё и вопрос про отчётность: куда деть тяжёлый агрегат, который читают часто, а пересчитывать при каждом обращении дорого.
Как отвечать
Обычное представление это сохранённый запрос: при обращении планировщик подставляет его тело и считает заново. Материализованное хранит результат физически, как таблицу, поэтому читается быстро и может иметь собственные индексы, но живёт данными на момент последнего обновления.
CREATE MATERIALIZED VIEW sales_daily AS
SELECT day, sum(amount) AS total FROM sales GROUP BY day;
CREATE UNIQUE INDEX ON sales_daily (day);
REFRESH MATERIALIZED VIEW CONCURRENTLY sales_daily;Ключевые факты: автоматического обновления нет, пересчёт запускаете вы по расписанию или по событию; обычный REFRESH берёт исключительную блокировку, и на время пересчёта представление недоступно даже для чтения; вариант CONCURRENTLY читателей не блокирует, но требует уникального индекса и работает дольше; инкрементального обновления в PostgreSQL нет, запрос выполняется целиком. Созданное с опцией WITH NO DATA представление читать нельзя до первого обновления.
Отдельно скажите, когда это правильный инструмент: витрина, которой хватает свежести в минутах или часах. Если нужны данные секундной давности, дешевле индекс, агрегатная таблица с дописыванием по триггеру или кэш на стороне приложения.
Где спотыкаются
Ждут, что представление обновится само после изменения базовых таблиц. Не обновится, и устаревающий отчёт находят уже пользователи.
Ставят обычный REFRESH на витрину, которую читают постоянно. Пересчёт держит блокировку, и все запросы к представлению ждут его окончания.
Тащат туда любую медленную выборку. Представление не ускоряет запрос, а переносит его стоимость на момент обновления: получасовой запрос даст полчаса нагрузки на базу по расписанию плюс место на диске под копию данных.