SQL Practice Logo

SQLPractice Online

Views & Materialized Views: Real-World

Module: Schema Design & Advanced DDL

You have a dashboard showing daily sales metrics. The query joins 5 tables, aggregates 10 million rows, and takes 45 seconds. Users refresh the dashboard 500 times per day. That's 6.25 hours of query time daily.

Option 1: Regular view - Still takes 45 seconds every time. No improvement.

Option 2: Materialized view - Pre-compute results, refresh hourly. Query takes 10ms. Dashboard loads instantly. Users are happy.

This is what materialized views do: they trade storage and refresh overhead for query speed. Netflix uses materialized views for "Top 10 in your country" - refreshed every 6 hours, queried billions of times. Reddit uses them for subreddit statistics - refreshed every 15 minutes, displayed on every page.

Regular views are different. They don't store data - they're saved queries. You use them for security (hide sensitive columns), abstraction (simplify complex joins), or convenience (reusable query logic). A view that shows "active_users" (WHERE status = 'active') is always current because it queries the base table every time.

Netflix: Top 10 Content by Country

Netflix shows "Top 10 in your country" based on billions of viewing records. Calculating in real-time would take minutes. Materialized view refreshes every 6 hours.

Materialized view pre-aggregates viewing data by country and content. Refreshes every 6 hours. Queries return in milliseconds. Staleness acceptable because trending content doesn't change minute-to-minute.

CREATE MATERIALIZED VIEW top_content_by_country AS

SELECT

country_code,

content_id,

content_title,

COUNT(DISTINCT user_id) as unique_viewers,

SUM(watch_duration_seconds) as total_watch_time,

ROW_NUMBER() OVER (PARTITION BY country_code ORDER BY COUNT(DISTINCT user_id) DESC) as rank

FROM viewing_history

WHERE view_timestamp >= CURRENT_TIMESTAMP - INTERVAL '7 days'

GROUP BY country_code, content_id, content_title;

CREATE INDEX idx_top_content_country_rank

ON top_content_by_country(country_code, rank);

-- Query top 10 in US

SELECT content_title, unique_viewers

FROM top_content_by_country

WHERE country_code = 'US' AND rank <= 10;

Query time: 3 minutes -> 50ms (3,600x faster)

Handles 500 million daily queries for trending content

Data freshness: 6 hours (acceptable for trending)

Materialized view size: 2GB (vs 500GB raw data)

Refresh time: 5 minutes every 6 hours

PostgreSQL

Reddit: Subreddit Statistics

Reddit shows subscriber counts, active users, and post counts for each subreddit. Calculating from billions of records is expensive. Materialized view refreshes every 15 minutes.

Materialized view aggregates user subscriptions, activity, and posts per subreddit. Refreshes every 15 minutes. Displayed on every subreddit page.

CREATE MATERIALIZED VIEW subreddit_stats AS

SELECT

s.subreddit_id,

s.name,

COUNT(DISTINCT sub.user_id) as subscriber_count,

COUNT(DISTINCT CASE WHEN a.last_active >= NOW() - INTERVAL '24 hours'