Filtrado de uniones únicamente usando WHERE
puede ser extremadamente ineficiente en algunos escenarios comunes. Por ejemplo:
SELECT * FROM people p, companies c
WHERE p.companyID = c.id AND p.firstName = 'Daniel'
La mayoría de las bases de datos ejecutarán esta consulta literalmente, tomando primero el producto cartesiano
de las people
y companies
tablas y entonces filtrado por aquellos que tienen companyID
coincidentes y id
los campos. Si bien el producto sin restricciones no existe en ningún otro lugar que no sea en la memoria y solo por un momento, su cálculo lleva algún tiempo.
Un mejor enfoque es agrupar las restricciones con JOIN
s donde sea relevante. Esto no solo es subjetivamente más fácil de leer, sino también mucho más eficiente. Así:
SELECT * FROM people p JOIN companies c ON p.companyID = c.id
WHERE p.firstName = 'Daniel'
Es un poco más largo, pero la base de datos puede ver el ON
cláusula y utilícela para calcular el JOIN
totalmente restringido directamente, en lugar de empezar con todo y luego limitando hacia abajo. Esto es más rápido de calcular (especialmente con grandes conjuntos de datos y/o uniones de muchas tablas) y requiere menos memoria.
Cambio cada consulta que veo que usa la "coma JOIN
" sintaxis. En mi opinión, el único propósito de su existencia es la concisión. Teniendo en cuenta el impacto en el rendimiento, no creo que esta sea una razón de peso.