Learn SQL/Advanced/Query Performance/SQL JOIN Performance

SQL JOIN Performance

Joins are usually cheap when both sides have the right index — expensive when neither does.

What & Why

A join's cost depends heavily on whether the join column is indexed on both sides. Without an index, matching rows between two tables often means scanning one side entirely for every row of the other — expensive at scale.

See How It Works

BUSINESS QUESTION

Marketing summarizes recent leads only for active campaigns.

idnamechannelspendstart_dateend_datestatustarget_segment
1Spring Launchgoogle_ads55000.002024-01-152024-03-31activesmb
2Retention Webinaremail45000.002024-02-102024-04-15activeenterprise
3Finance Retargetinglinkedin50000.002024-03-122024-05-31activeenterprise
4Enterprise Searchgoogle_ads60000.002024-04-012024-06-30activeenterprise
idcampaign_idemailcreated_atqualified_atconverted_atlead_scoresourcecountry
3011ana@example.com2024-01-21 09:10:00+002024-01-22 11:00:00+002024-02-02 10:00:00+0086google_adsUS
3021ben@example.com2024-01-24 12:40:00+00NULLNULL52google_adsCA
3032chloe@example.com2024-02-16 08:30:00+002024-02-18 14:20:00+00NULL74emailGB
3043dev@example.com2024-03-20 17:15:00+002024-03-21 09:00:00+002024-04-04 16:00:00+0091linkedinUS
EXAMPLE QUERY
SELECT
  c.id AS campaign_id,
  c.name,
  COUNT(l.id) AS recent_leads
FROM marketing.campaigns c
LEFT JOIN marketing.leads l
  ON l.campaign_id = c.id
  AND l.created_at >= TIMESTAMPTZ '2024-02-01 00:00:00+00'
WHERE c.status = 'active'
GROUP BY c.id, c.name
ORDER BY recent_leads DESC, campaign_id;
RESULT — active campaigns with leads since February 1
campaign_idnamerecent_leads
2Retention Webinar1
3Finance Retargeting1
1Spring Launch0
4Enterprise Search0

The fixed join predicate counts the February and March leads while LEFT JOIN preserves campaigns with zero qualifying leads.

This lesson's practice is part of Pro.

Advanced business practice

Sign up free to try it on a real business scenario