Quand j'écris une requête comme celle-ci ...
select *
from table1 t1
join table2 t2
on t1.id = t2.id
L'optimiseur SQL, pas sûr que ce soit le bon terme, traduit-il cela en ...
select *
from table1 t1, table2 t2
where t1.id = t2.id
Essentiellement, l'instruction Join dans SQL Server est-elle simplement un moyen plus simple d'écrire SQL? Ou est-il réellement utilisé au moment de l'exécution?
Edit: j'utilise presque toujours et j'utiliserai presque toujours la syntaxe Join. Je suis juste curieux de savoir ce qui se passe.
sql-server
t-sql
join
optimization
Mr. Ant
la source
la source
GROUP BY ALL
dansGROUP BY ALL
t-il exprès? :-)Réponses:
Celles-ci s'effondrent à la même chose en interne. Le premier est celui que vous devez toujours écrire . Plus important encore, pourquoi est-ce important? Ils sont identiques en termes de plan d'exécution et de performances (en supposant que vous ne vous trompez pas, ce qui est plus facile à faire avec la syntaxe paresseuse à l'ancienne).
Voici la preuve en utilisant AdventureWorks qu'il n'y en a pas
CROSS JOIN
etfilter
continue.La jointure explicite:
La jointure implicite:
Regardez, ma! Plans identiques, résultats identiques, aucune jointure croisée ou filtre vu nulle part.
(Pour plus de clarté, l'avertissement sur l'
SELECT
opérateur dans les deux cas est une conversion implicite affectant la cardinalité, rien à voir avec la jointure dans les deux cas.)la source
À strictement parler, il existe une différence dans l'entrée de l'optimiseur de requête entre les deux formes:
Comme vous pouvez le voir, le
ON
prédicat de la clause est étroitement lié à la jointure en utilisant la syntaxe moderne. Avec l'ancienne syntaxe, il existe une jointure croisée logique suivie d'une sélection relationnelle (un filtre de ligne).L'optimiseur de requêtes réduit presque toujours la sélection relationnelle dans la jointure pendant l'optimisation, ce qui signifie que les deux formulaires produiront très probablement des plans de requête équivalents, mais il n'y a aucune garantie réelle.
la source
Pour la jointure interne, ils sont interchangeables, mais pour les jointures externes, ils ont des significations différentes - ON correspond et WHERE est un filtrage simple. Il est donc préférable de s'en tenir à la correspondance de syntaxe JOIN correcte sur ON.
la source
OK, j'étais curieux alors j'ai fait un test. J'ai obtenu des plans d'exécution réels pour les éléments suivants.
et
Je les ai comparés objet par objet et ils étaient identiques. Donc, au moins pour un exemple très simple, ils sont arrivés à la même chose. J'ai également vérifié les statistiques IO et le temps et ils étaient suffisamment proches pour être la même chose.
Cela étant dit, vous devez utiliser la
JOIN
syntaxe car elle est plus facile à lire et vous êtes moins susceptible de faire des erreurs, en particulier dans les requêtes complexes. Et la syntaxe*=
/=*
pour lesOUTER
jointures a déjà été supprimée à partir de SQL-Server 2005.la source