Estou tentando comparar duas consultas:
Pergunta 1:
SELECT a,b,c,d,e
FROM tableA
LEFT JOIN tableB
ON tableA.a=tableB.a
WHERE tableA.b=tableB.b AND tableA.c=tableB.c AND tableA.d=tableB.d AND tableA.e=tableB.e
Pergunta 2:
SELECT a,b,c,d,e
FROM tableA
LEFT JOIN tableB
ON tableA.a=tableB.a AND tableA.b=tableB.b AND tableA.c=tableB.c AND tableA.d=tableB.d
WHERE tableA.e=tableB.e
Estou certo em dizer que essas duas consultas dão os mesmos resultados?
Além disso, é correto dizer que a primeira consulta cria uma tabela maior para a qual fazer uma WHERE
condição maior; enquanto no segundo caso temos uma tabela construída menor à qual o simples WHERE
é então aplicado.
Supondo que os resultados sejam os mesmos, qual consulta deve ser preferida? Existe um problema óbvio de desempenho?
Se considerarmos que você usa
INNER JOIN
em vez deLEFT JOIN
(o que parece ser sua intenção), essas duas consultas são funcionalmente equivalentes. Os otimizadores de consulta revisarão e avaliarão os critérios em suaWHERE
cláusula e em suaFROM
cláusula e considerarão todos esses fatores ao criar planos de consulta para alcançar o plano de execução mais eficiente. Se fizermos anEXPLAIN
em ambas as instruções, obteremos o mesmo resultado:Pergunta 1 :
[Resultados] :
Pergunta 2 :
[Resultados] :
Você pode revisar os detalhes completos nos links a seguir. Também criei um exemplo do SQL 2008 para que você possa comparar como os dois mecanismos funcionam (que é o mesmo):
Exemplo de consulta MySQL
Exemplo de consulta SQL 2008 (certifique-se de 'Exibir plano de execução' para ambos os resultados)