SQL Practice Logo

SQLPractice Online

Subquery Optimization: Real-World

Module: Query Optimization & Performance

E-commerce product listings with subqueries for ratings, reviews, and inventory - optimize from 15 seconds to under 1 second. Analytics dashboards with correlated subqueries - reduce query time by 100-1000x.

Airbnb - Listing Search with Subqueries

Airbnb listing search page showed property details with average rating, review count, and availability. Original query used correlated subqueries for each metric. With 5M listings, search results took 25 seconds to load, causing timeouts and poor user experience.

Converted all correlated subqueries to JOINs with pre-aggregated CTEs. Created materialized view for review statistics (updated hourly). Added composite indexes on listing_id for all related tables. Used window functions for ranking within search results. Implemented query result caching for popular searches.

-- Before: 25 seconds

SELECT

l.listing_id,

l.title,

(SELECT AVG(rating) FROM reviews WHERE listing_id = l.id) as avg_rating,

(SELECT COUNT(*) FROM reviews WHERE listing_id = l.id) as review_count,

(SELECT COUNT(*) FROM bookings WHERE listing_id = l.id AND status = 'available') as available_days

FROM listings l

WHERE l.city = 'San Francisco';

-- After: 0.8 seconds (31x faster)

WITH review_stats AS (

SELECT listing_id, AVG(rating) as avg_rating, COUNT(*) as review_count

FROM reviews

GROUP BY listing_id

),

availability AS (

SELECT listing_id, COUNT(*) as available_days

FROM bookings

WHERE status = 'available'

GROUP BY listing_id

)

SELECT

l.listing_id,

l.title,

COALESCE(rs.avg_rating, 0) as avg_rating,

COALESCE(rs.review_count, 0) as review_count,

COALESCE(a.available_days, 0) as available_days

FROM listings l

LEFT JOIN review_stats rs ON l.id = rs.listing_id

LEFT JOIN availability a ON l.id = a.listing_id

WHERE l.city = 'San Francisco';

Query time: 25s to 0.8s (31x faster)

Search page load: 30s to 2s

Timeout rate: 15% to 0.1%

User satisfaction: 45% increase

Conversion rate: 22% increase