Ответ
Материализованное представление (Materialized View) — это объект базы данных, который физически хранит на диске результат выполнения SQL-запроса, подобно таблице. В отличие от обычного представления (VIEW), которое является лишь сохраненным запросом и выполняет его каждый раз при обращении, материализованное представление содержит реальные данные, которые необходимо периодически обновлять (refresh).
Основные цели использования:
- Производительность: Мгновенное выполнение сложных агрегирующих запросов, джойнов и вычислений за счет использования предварительно рассчитанных данных.
- Снижение нагрузки: Перенос вычислительной нагрузки с времени выполнения запроса на время обновления представления.
- Кэширование результатов: Особенно полезно для отчетов, дашбордов и аналитических систем, где данные меняются нечасто.
Пример создания в PostgreSQL:
-- Создание материализованного представления с агрегацией продаж
CREATE MATERIALIZED VIEW monthly_sales AS
SELECT
DATE_TRUNC('month', order_date) AS month,
product_id,
SUM(quantity) AS total_quantity,
SUM(quantity * price) AS revenue
FROM sales
GROUP BY DATE_TRUNC('month', order_date), product_id;
-- Создание индекса для ускорения запросов к представлению
CREATE INDEX idx_monthly_sales_month ON monthly_sales (month);
-- Ручное обновление данных (полная перестройка)
REFRESH MATERIALIZED VIEW monthly_sales;
-- Обновление с возможностью параллельного чтения (CONCURRENTLY) в PostgreSQL
REFRESH MATERIALIZED VIEW CONCURRENTLY monthly_sales;
Недостатки:
- Устаревание данных: Данные могут не соответствовать текущему состоянию базовых таблиц до момента обновления.
- Накладные расходы на хранение: Требует дополнительного дискового пространства.
- Затраты на обновление: Процесс REFRESH может быть ресурсоемким.
Использование в Java-приложениях: К материализованным представлениям можно обращаться через JDBC или ORM (например, Hibernate), как к обычным таблицам или представлениям.