Materialized view — a database object storing the result of a query as a physical table, unlike a regular view (virtual). Fast on SELECT (just read table), but requires explicit refresh on data changes. Used for: expensive aggregations (SUM, AVG over millions of rows), JOIN of multiple large tables, analytics dashboards. Native support: Postgres, Oracle. MySQL — via triggers or periodic table swap.
Below: details, example, related terms, 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 for fast queries
CREATE INDEX ON orders_daily_summary (day);
-- Refresh periodically (cron)
REFRESH MATERIALIZED VIEW CONCURRENTLY orders_daily_summary;Regular — virtual, recomputed on every query. Materialized — stored, fast read, stale data.
Balance freshness vs load. For dashboards: 5-15 min. For reports: hourly/daily. Incremental better for high-rate tables.
<code>REFRESH MATERIALIZED VIEW CONCURRENTLY</code> — no lock on readers. Requires UNIQUE index. Recommended for prod.