Deelnames filteren uitsluitend met WHERE
kan in sommige veelvoorkomende scenario's extreem inefficiënt zijn. Bijvoorbeeld:
SELECT * FROM people p, companies c
WHERE p.companyID = c.id AND p.firstName = 'Daniel'
De meeste databases zullen deze zoekopdracht vrij letterlijk uitvoeren, eerst met het Cartesian product
van de people
en companies
tabellen en vervolgens filteren op die met overeenkomende companyID
en id
velden. Hoewel het volledig onbeperkte product nergens anders bestaat dan in het geheugen en dan slechts voor een moment, kost de berekening ervan enige tijd.
Een betere benadering is om de beperkingen te groeperen met de JOIN
s waar relevant. Dit is niet alleen subjectief gemakkelijker te lezen, maar ook veel efficiënter. Dus:
SELECT * FROM people p JOIN companies c ON p.companyID = c.id
WHERE p.firstName = 'Daniel'
Het is iets langer, maar de database kan kijken naar de ON
clausule en gebruik deze om de volledig beperkte JOIN
. te berekenen direct, in plaats van te beginnen met alles en dan naar beneden begrenzen. Dit is sneller te berekenen (vooral met grote datasets en/of veel-tabel-joins) en vereist minder geheugen.
Ik verander elke query die ik zie die gebruik maakt van de "komma JOIN
" syntaxis. Naar mijn mening is beknoptheid het enige doel van het bestaan ervan. Gezien de impact op de prestaties, denk ik niet dat dit een dwingende reden is.