Filtraggio dei join utilizzando esclusivamente WHERE
può essere estremamente inefficiente in alcuni scenari comuni. Ad esempio:
SELECT * FROM people p, companies c
WHERE p.companyID = c.id AND p.firstName = 'Daniel'
La maggior parte dei database eseguirà questa query in modo abbastanza letterale, prendendo prima il prodotto cartesiano
delle people
e companies
tabelle e poi filtrando per quelli che hanno companyID
corrispondente e id
campi. Anche se il prodotto completamente non vincolato non esiste da nessuna parte ma nella memoria e quindi solo per un momento, il suo calcolo richiede del tempo.
Un approccio migliore consiste nel raggruppare i vincoli con JOIN
s se pertinente. Questo non è solo soggettivamente più facile da leggere, ma anche molto più efficiente. Quindi:
SELECT * FROM people p JOIN companies c ON p.companyID = c.id
WHERE p.firstName = 'Daniel'
È un po' più lungo, ma il database è in grado di guardare ON
e usala per calcolare il JOIN
completamente vincolato direttamente, invece di iniziare con tutto e poi limitandoci. È più veloce da calcolare (soprattutto con set di dati di grandi dimensioni e/o join di molte tabelle) e richiede meno memoria.
Cambio ogni query che vedo che utilizza la "virgola JOIN
" sintassi. Secondo me, l'unico scopo della sua esistenza è la concisione. Considerando l'impatto sulle prestazioni, non credo che questo sia un motivo convincente.