SQL Practice Logo

SQLPractice Online

Query Optimization Fundamentals: Examples

Module: Query Optimization & Performance

E-commerce Order Query Optimization

intermediate

Optimize a slow customer order history query that takes 45 seconds on a table with 10M orders

-- BEFORE: Unoptimized query (45 seconds)

SELECT *

FROM orders o

JOIN customers c ON o.customer_id = c.customer_id

JOIN order_items oi ON o.order_id = oi.order_id

JOIN products p ON oi.product_id = p.product_id

WHERE YEAR(o.order_date) = 2024

AND c.country = 'USA'

ORDER BY o.order_date DESC;

-- STEP 1: Analyze execution plan

EXPLAIN ANALYZE

SELECT *

FROM orders o

JOIN customers c ON o.customer_id = c.customer_id

JOIN order_items oi ON o.order_id = oi.order_id

JOIN products p ON oi.product_id = p.product_id

WHERE YEAR(o.order_date) = 2024

AND c.country = 'USA'

ORDER BY o.order_date DESC;

-- Execution Plan shows:

-- Seq Scan on orders (cost=0..250000 rows=10000000)

-- Seq Scan on customers (cost=0..50000 rows=2000000)

-- Problem: Full table scans, function on indexed column

-- STEP 2: Create strategic indexes

CREATE INDEX idx_orders_date ON orders(order_date);

CREATE INDEX idx_orders_customer ON orders(customer_id, order_date);

CREATE INDEX idx_customers_country ON customers(country, customer_id);

CREATE INDEX idx_order_items_order ON order_items(order_id);

CREATE INDEX idx_order_items_product ON order_items(product_id);

-- STEP 3: Optimize query structure

-- AFTER: Optimized query (0.8 seconds)

SELECT

o.order_id,

o.order_date,

o.total_amount,

c.customer_name,

c.email,