Filtrando junções usando apenas
WHERE
pode ser extremamente ineficiente em alguns cenários comuns. Por exemplo:SELECT * FROM people p, companies c
WHERE p.companyID = c.id AND p.firstName = 'Daniel'
A maioria dos bancos de dados executará essa consulta literalmente, primeiro usando o produto cartesiano das
people
e companies
tabelas e depois filtrando por aqueles que têm companyID
correspondente e id
Campos. Embora o produto totalmente irrestrito não exista em nenhum lugar a não ser na memória e apenas por um momento, seu cálculo leva algum tempo. Uma abordagem melhor é agrupar as restrições com o
JOIN
s quando relevante. Isso não é apenas subjetivamente mais fácil de ler, mas também muito mais eficiente. Assim:SELECT * FROM people p JOIN companies c ON p.companyID = c.id
WHERE p.firstName = 'Daniel'
É um pouco mais longo, mas o banco de dados é capaz de ver o
ON
cláusula e use-a para calcular o JOIN
totalmente restrito diretamente, em vez de começar com tudo e, em seguida, limitando para baixo. Isso é mais rápido de calcular (especialmente com grandes conjuntos de dados e/ou junções de muitas tabelas) e requer menos memória. Eu mudo todas as consultas que vejo que usam a "vírgula
JOIN
" sintaxe. Na minha opinião, o único propósito para sua existência é a concisão. Considerando o impacto no desempenho, não acho que isso seja uma razão convincente.