Filtrering går enbart med WHERE
kan vara extremt ineffektivt i vissa vanliga scenarier. Till exempel:
SELECT * FROM people p, companies c
WHERE p.companyID = c.id AND p.firstName = 'Daniel'
De flesta databaser kommer att köra denna fråga helt bokstavligt, först tar den kartesiska produkten
av people
och companies
tabeller och sedan filtrering efter de som har matchande companyID
och id
fält. Medan den helt fria produkten inte existerar någon annanstans än i minnet och sedan bara för ett ögonblick, tar dess beräkning lite tid.
Ett bättre tillvägagångssätt är att gruppera begränsningarna med JOIN
s där det är relevant. Detta är inte bara subjektivt lättare att läsa utan också mycket mer effektivt. Alltså:
SELECT * FROM people p JOIN companies c ON p.companyID = c.id
WHERE p.firstName = 'Daniel'
Det är lite längre, men databasen kan titta på ON
och använd den för att beräkna den fullständigt begränsade JOIN
direkt, istället för att börja med allt och sedan begränsa. Detta är snabbare att beräkna (särskilt med stora datamängder och/eller kopplingar med många tabeller) och kräver mindre minne.
Jag ändrar varje fråga jag ser som använder "komma JOIN
" syntax. Enligt min åsikt är det enda syftet med dess existens kortfattadhet. Med tanke på prestandapåverkan tror jag inte att detta är ett övertygande skäl.