Quando escrevo uma consulta como esta ...
select *
from table1 t1
join table2 t2
on t1.id = t2.id
O otimizador de SQL, que não tem 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?
Edit: Eu quase sempre, e quase sempre, uso a sintaxe Join. Estou apenas curioso para saber o que acontece.
sql-server
t-sql
join
optimization
Mr. Ant
fonte
fonte
GROUP BY ALL
emGROUP BY ALL
de propósito? :-)Respostas:
Aqueles colapsam internamente à mesma coisa. O primeiro é o que você deve sempre escrever . 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 preguiçosa e antiga).
Aqui está uma 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 ma! Planos idênticos, resultados idênticos, sem junções cruzadas ou filtros vistos em qualquer lugar.
(Para maior clareza, o aviso no
SELECT
operador nos dois casos é uma conversão implícita que afeta a cardinalidade, nada a ver com a junção nos dois casos.)fonte
A rigor, há uma diferença na entrada do 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.
fonte
Para junção interna, eles são intercambiáveis, mas para Junções externas, eles têm significados diferentes - o ON está correspondendo e WHERE é uma filtragem simples. Portanto, é melhor manter a correspondência de sintaxe JOIN correta no ON.
fonte
OK, fiquei curioso, então fiz um teste. Eu tenho planos de execução reais para o seguinte.
e
Comparei-os objeto por objeto e eles eram idênticos. Então, pelo menos para um exemplo muito simples, eles saíram para a mesma coisa. Também verifiquei as estatísticas IO e o tempo, e eles estavam perto o suficiente para serem a mesma coisa.
Dito isto, você deve usar a
JOIN
sintaxe porque é mais fácil de ler e é menos provável que cometa erros, principalmente em consultas complicadas. E a sintaxe*=
/=*
paraOUTER
junções já foi removida a partir do SQL-Server 2005.fonte