Quando eu escrevo uma consulta como esta...
select *
from table1 t1
join table2 t2
on t1.id = t2.id
O otimizador SQL, não tenho certeza se esse é o termo correto, traduz isso para...
select *
from table1 t1, table2 t2
where t1.id = t2.id
Essencialmente, a instrução Join no SQL Server é apenas uma maneira mais fácil de escrever sql? Ou é realmente usado em tempo de execução?
Editar: quase sempre, e quase sempre, uso a sintaxe Join. Estou apenas curioso para saber o que acontece.
Esses geralmente entrarão em colapso para a mesma coisa internamente. O primeiro é aquele que você sempre deve escrever , IMHO. Mais importante, por que isso importa? Eles são idênticos em termos de plano de execução e desempenho (supondo que você não estrague tudo, o que é mais fácil de fazer com a sintaxe antiga e preguiçosa).
Aqui está a prova usando o AdventureWorks de que não existe
CROSS JOIN
e estáfilter
acontecendo.A junção explícita:
A junção implícita:
Olha, mãe! Planos idênticos, resultados idênticos, sem junções cruzadas ou filtros vistos em qualquer lugar.
(Para maior clareza, o aviso no
SELECT
operador em ambos os casos é uma conversão implícita que afeta a cardinalidade, nada a ver com a junção em nenhum dos casos.)Estritamente falando, há uma diferença na entrada para o otimizador de consulta entre os dois formulários:
Como você pode ver, o
ON
predicado da cláusula está fortemente vinculado à junção usando a sintaxe moderna. Com a sintaxe mais antiga, há uma junção cruzada lógica seguida por uma seleção relacional (um filtro de linha).O otimizador de consulta quase sempre recolhe a seleção relacional na junção durante a otimização, o que significa que os dois formulários provavelmente produzirão planos de consulta equivalentes, mas não há garantia real.
OK, eu estava curioso, então fiz um teste. Eu tenho planos de execução reais para o seguinte.
e
Eu os comparei objeto por objeto e eles eram idênticos. Então, pelo menos para um exemplo muito simples, eles chegaram à mesma coisa. Eu também verifiquei as estatísticas IO e tempo e eles estavam próximos o suficiente para ser a mesma coisa.
Dito isto, você deve usar a
JOIN
sintaxe porque é mais fácil de ler e é menos provável que você cometa erros, principalmente em consultas complicadas. E a sintaxe*=
/ para junções já foi removida a partir do SQL-Server 2005.=*
OUTER
Para junção interna, eles são intercambiáveis, mas para junções externas, eles têm significados diferentes - o ON é correspondente e o WHERE é uma filtragem simples. Portanto, é melhor manter a correspondência de sintaxe JOIN correta no ON.