68 votes

Les performances de la jointure interne par rapport à la croix rejoindre

L'effet de la délivrance d'une jointure interne est le même comme indiquant une jointure croisée avec la condition de jointure dans la clause where. J'ai remarqué que beaucoup de gens dans mon entreprise, utiliser les jointures croisées, où je voudrais utiliser des jointures internes. Je n'ai pas remarqué de gain de performance significatif après la modification de certaines de ces questions et je me demandais si c'était juste une coïncidence ou si le SGBD optimise ces questions de manière transparente (MySql dans notre cas). Et voici un exemple concret à la discussion:

SELECT User.*
FROM User, Address
WHERE User.addressId = Address.id;

SELECT User.*
FROM User
INNER JOIN Address ON (User.addressId = Address.id);

66voto

karim79 Points 178055

Les Jointures croisées de produire des résultats qui se composent de toutes les combinaisons de lignes à partir de deux ou plusieurs tables. Cela signifie que si la table dispose de 6 lignes et le tableau B a 3 lignes, une jointure croisée entraînera 18 lignes. Il n'y a pas de relation établie entre les deux tableaux – vous littéralement juste de produire toutes les combinaisons possibles.

Avec une jointure interne, les valeurs de la colonne à partir d'une ligne d'un tableau sont combinées avec les valeurs de la colonne à partir d'une autre ligne d'un autre (ou le même) de la table pour former une seule ligne de données.

Si une clause where est ajouté à une jointure croisée, elle se comporte comme une jointure interne que la OÙ impose un facteur limitant.

Aussi longtemps que vos requêtes de respecter le sens commun et de fournisseur de la performance des lignes directrices, j'aime à penser que la décision sur le type de jointure à utiliser pour être une simple question de goût.

28voto

Otávio Décio Points 44200

Il n'y a pas de différence autre que la jointure interne est beaucoup plus claire, parce qu'elle définit le rejoindre, laissant la clause where pour être la condition limite.

19voto

Emil H Points 24062

Utilisez EXPLIQUER pour afficher le plan de requête pour les deux requêtes, et de voir si il n'y a aucune différence. Très probablement MySQL utilisera le même plan d'exécution dans les deux cas. J'ai utiliser la JOINTURE INTERNE de la syntaxe, principalement parce qu'il est beaucoup plus claire.

12voto

Jonathan Points 6934

Je trouve que le lieu de travail qui permettent à la première syntaxe (séparés par des virgules tables) ont habituellement beaucoup de temps de débogage lorsque plusieurs lignes sont retournées que prévu. Involontaire jointures croisées sont le fléau d'un système, et peut apporter encore plus à l'écoute de la base de données à genoux. Il a apporté de la pré-prod du système à un arrêt brutal à au moins deux reprises dans la dernière année.

La deuxième syntaxe la syntaxe de jointure) et les forces de l'écrivain à réfléchir sur la façon dont les tables sont jointes ensemble d'abord, puis seulement le retour intéressant lignes. Il est impossible de prendre accidentellement une jointure croisée à l'aide de cette syntaxe, et donc le risque d'une exécution de requêtes mal est réduit.

Toutefois, cette question de côté, je n'ai jamais remarqué aucune différence de vitesse entre les deux syntaxes dans tous les systèmes que j'ai eu.

2voto

HLGEM Points 54641

Le premier exemple est fonctionnellement le même que le deuxième exemple. Toutefois, cette syntaxe doit être évitée pour plusieurs raisons. D'abord, il est beaucoup plus facile à obtenir accidentellement une jointure croisée lors de l'utilisation de cette syntaxe surtout quand il y a plusieurs jointures dans le tableau. Si vous voyez beaucoup de ce type de requête avec le mot-clé distinct, vous avez probablement quelqu'un qui est d'essayer de corriger les jointures croisées.

Ensuite, la gauche et la droite la syntaxe de jointure à l'aide de l'ancien style est obsolète et n'est plus pris en charge. En outre, il ne fonctionne pas correctement maintenant de toute façon. Parfois, il a mal interprété la jointure externe et envoie la mauvaise série de résultats. Donc, toutes les requêtes que vous avez à l'aide de = ou = dans la clause where doit être immédiatement remplacé.

Troisièmement, la norme ANSI jointures sont plus faciles à comprendre et à maintenir. La compréhension de jointures est l'une des plus importantes compétences de base que n'importe qui d'interrogation de toute base de données relationnelle a besoin. Il a été mon expérience que certaines personnes qui utilisent l'ancien style ne comprends pas vraiment la rejoint et la façon dont ils travaillent et donc écrire des requêtes qui ne sont pas réellement faire ce qu'ils voulaient.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X