Quels sont les avantages de la fermeture transitive de jointure explicite dans SQL ?

StackOverflow https://stackoverflow.com/questions/11028

  •  08-06-2019
  •  | 
  •  

Question

Lorsque je joins trois tables ou plus par une colonne commune, j'écrirais ma requête comme ceci :

SELECT *
FROM   a, b, c
WHERE  a.id = b.id
AND    b.id = c.id

un collègue m'a récemment demandé pourquoi je n'avais pas fait de déclaration explicite Rejoignez la fermeture transitive dans mes requêtes comme ceci :

SELECT *
FROM   a, b, c
WHERE  a.id = b.id
AND    b.id = c.id
AND    c.id = a.id

y a-t-il vraiment des avantages à cela ?L’optimiseur peut sûrement l’impliquer pour lui-même ?

modifier:Je sais que c'est une syntaxe maléfique, mais c'est un exemple rapide et sale de code hérité légitime +1 @Stu pour le nettoyer

Était-ce utile?

La solution

Vous n'avez pas besoin de le faire dans les moteurs de base de données d'aujourd'hui, mais il fut un temps où de telles choses donnaient à l'optimiseur de requêtes plus d'indications sur les chemins d'index possibles et donc des résultats plus rapides.

De nos jours, toute cette syntaxe disparaît de toute façon.

Autres conseils

Il s’agit d’une syntaxe héritée sale et maléfique.Vous écrivez ceci comme

Select
  *  -- Oh, and don't ever use *, either
From
  A 
  Inner Join B On A.ID = B.ID
  Inner Join C On B.ID = C.ID

Non, cette syntaxe provient des jours précédant l'arrivée des jointures dans le langage.Je ne suis pas sûr des problèmes qui y sont associés, mais il existe certainement des constructions de langage qui sont mieux prises en charge pour la jointure de tables.

Je veux juste dire que ce genre d’adhésion est l’œuvre du diable.
Pensez-y ;les conditions de jointure et de filtrage sont mélangées dans l'instruction Where.
Que se passe-t-il lorsque vous devez joindre 20 tables et filtrer sur 15 valeurs ?

Encore une fois, juste mon 0,02 $

Dans Microsoft SQL, les plans de requête pour ces deux requêtes sont identiques : elles sont exécutées de la même manière.

Si vous le regardez d’un point de vue mathématique, vos exemples devraient donner les mêmes résultats.

une = b = c

Ainsi, votre premier exemple produirait les mêmes résultats que le second, donc pas besoin de faire de travail supplémentaire.

Cette question est similaire à celle-ci ici avec une explication très approfondie :

Question SQL de l'article de Joel Spolsky

La réponse courte est que la déclaration explicite de la propriété transitiv peut accélérer la requête.En effet, l'optimisation des requêtes n'est pas une tâche triviale et certains serveurs SQL peuvent rencontrer des problèmes.

Cette syntaxe a cependant son utilité...il y a des moments où vous devez joindre deux tables sur plus d'un champ

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top