SQL Practice Logo

SQLPractice Online

CTE Performance Optimization: Examples

Module: Subqueries & CTEs

Fix Slow Dashboard Query: Filter Early + Materialize

advanced

Dashboard query takes 45 seconds. Three issues: (1) CTE scans entire table without filtering, (2) CTE referenced 3 times but not materialized, (3) No indexes.

-- BEFORE: 45 seconds (multiple issues)

WITH all_sales AS (

SELECT *

FROM sales -- 50M rows, no filtering!

)

SELECT 'High Value' as segment, *

FROM all_sales

WHERE sale_date >= '2024-01-01' AND amount > 1000 -- Filter AFTER CTE

UNION ALL

SELECT 'Medium Value', *

FROM all_sales

WHERE sale_date >= '2024-01-01' AND amount BETWEEN 100 AND 1000

UNION ALL

SELECT 'Low Value', *

FROM all_sales

WHERE sale_date >= '2024-01-01' AND amount < 100;

-- Problems:

-- 1. CTE scans 50M rows (no filter)

-- 2. CTE executes 3 times (not materialized)

-- 3. No index on sale_date or amount

-- Total: 150M rows scanned

-- AFTER: 0.8 seconds (all issues fixed)

-- Step 1: Create indexes

CREATE INDEX idx_sales_date_amount ON sales(sale_date, amount);

-- Step 2: Filter in CTE + materialize

WITH recent_sales AS MATERIALIZED (

SELECT *

FROM sales

WHERE sale_date >= '2024-01-01' -- Filter IN CTE

)

SELECT 'High Value' as segment, *

FROM recent_sales

WHERE amount > 1000

UNION ALL

SELECT 'Medium Value', *

FROM recent_sales

WHERE amount BETWEEN 100 AND 1000