Materialized view — database object, хранящий результат query как physical table, в отличие от regular view (virtual). Фаst при SELECT (просто read table), но требует explicit refresh при data changes. Используется для: expensive aggregations (SUM, AVG по millions rows), JOIN multiple large tables, analytics dashboards. Native support: Postgres, Oracle. MySQL — через triggers или periodic table swap.
Ниже: подробности, пример, смежные термины, FAQ.
-- Create materialized view
CREATE MATERIALIZED VIEW orders_daily_summary AS
SELECT
DATE(created_at) AS day,
status,
COUNT(*) AS orders,
SUM(amount) AS revenue
FROM orders
GROUP BY day, status;
-- Index для fast queries
CREATE INDEX ON orders_daily_summary (day);
-- Refresh periodically (cron)
REFRESH MATERIALIZED VIEW CONCURRENTLY orders_daily_summary;Regular — virtual, re-computed при каждом query. Materialized — stored, fast read, stale data.
Balance freshness vs load. For dashboards: 5-15 min. For reports: hourly/daily. Incremental better для high-rate tables.
<code>REFRESH MATERIALIZED VIEW CONCURRENTLY</code> — no lock on читателей. Требует UNIQUE index. Recommended для prod.