CTE Performance Optimization: Performance
Module: Subqueries & CTEs
**Performance Optimization Checklist:**
1. **Always check execution plan first**
- EXPLAIN ANALYZE shows actual performance
- Don't guess, measure
2. **Materialize reused CTEs**
- If CTE referenced 2+ times, add MATERIALIZED
- Check execution plan to verify
3. **Filter as early as possible**
- Push WHERE conditions into CTE definition
- Reduces data volume early
4. **Index columns used in:**
- WHERE clauses
- JOIN conditions
- ORDER BY clauses
- GROUP BY columns
5. **Consider alternatives:**
- Window functions for running totals, rankings
- JOINs for simple combinations
- Temp tables for very large intermediate results
6. **Monitor memory usage:**
- Materialized CTEs use work_mem (PostgreSQL)
- Large CTEs can spill to disk (slow)
- Increase work_mem if needed
7. **Update statistics:**
- ANALYZE table ensures accurate row estimates
- Bad estimates lead to bad execution plans
8. **Avoid over-nesting:**
- Too many nested CTEs hurt readability
- Consider breaking into temp tables
**Benchmarks (50M row table):**
| Issue | Before | After | Improvement |
|-------|--------|-------|-------------|
| No filtering in CTE | 30s | 2s | 15x faster |
| CTE executed 3 times | 45s | 8s | 5.6x faster |
| Missing index | 30s | 0.5s | 60x faster |
| All three issues | 120s | 1s | 120x faster |
Filter early: Push WHERE into CTE definition (100x improvement possible)
Materialize reused CTEs: Add MATERIALIZED hint (3-5x improvement)
Index join columns: CREATE INDEX on foreign keys (60x improvement)
Use window functions: Replace correlated subqueries (100x improvement)