JOINTURE SQL vs EN performance?
J'ai un cas où l'aide d'une JOINTURE ou une me donnera des résultats corrects... Qui a généralement une meilleure performance, et pourquoi? Combien ça dépend de ce serveur de base de données, vous êtes en cours d'exécution? (Pour info, je suis en utilisant MSSQL)
- 🙂 En fait j'ai été à la recherche pour un autre article que j'ai utilisé lorsque j'ai fait des recherches dans quelque chose de similaire il y a longtemps, et suis tombé sur qui un par erreur
- Désolé pour les éventuelles dupe... n'ai pas trouvé la question quand j'étais à la recherche
Vous devez vous connecter pour publier un commentaire.
Généralement parlant,
IN
etJOIN
sont différentes requêtes qui peuvent donner des résultats différents.n'est pas le même que
à moins que
b.col
est unique.Cependant, c'est le synonyme de la première requête:
Si la colonne de jointure est
UNIQUE
et marqués comme tels, ces deux requêtes de rendement le même plan dansSQL Server
.Si elle ne l'est pas, alors
IN
est plus rapide queJOIN
surDISTINCT
.Voir cet article dans mon blog pour les détails de performance:
EN
au lieu deJOIN
au lieu deEXISTE
DISTINCT
.SQL Server
est assez intelligent pour s'en apercevoir, et génère même des plans pour les deux requêtes. Pas sûr, cependant, la façon dont les autresRDBMS
's va se comporter.Drôle que vous mentionnez, j'ai fait un blog sur ce sujet.
Voir Oracle vs MySQL vs SQL Server: Agrégation vs Rejoint
Réponse courte: vous devez les tester et les bases de données individuelles varient beaucoup.
C'est plutôt dur à dire, en ordre à vraiment trouver ce qui fonctionne le mieux, vous devez réellement de profil, le temps d'exécution.
Comme une règle générale, je pense que si vous avez des indices sur votre colonnes de clé étrangère, et si vous êtes en utilisant uniquement (ou principalement) INNER JOIN conditions, puis la JOINTURE sera légèrement plus rapide.
Mais dès que vous commencez à l'aide d'une JOINTURE EXTERNE, ou si vous ne l'avez pas dans les index de clés étrangères, de la DANS la pourrait être plus rapide.
Marc
Un intéressant article sur la logique des différences: SQL Server: REJOIGNEZ vs vs, EXISTE - la logique de la différence
Je suis assez sûr que, en supposant que les relations et les index sont maintenu une Jointure un meilleur rendement dans l'ensemble (plus d'efforts dans le travail avec cette opération alors que d'autres). Si vous pensez à ce sujet, conceptuellement, alors son la différence entre les 2 requêtes et 1 de la requête.
Vous avez besoin de le raccorder à l'Analyseur de Requêtes et de les essayer et de voir la différence. Regardez également le Plan d'Exécution de Requête et d'essayer de réduire le nombre d'étapes.
Chaque base de données est mise en œuvre, mais vous pouvez probablement le deviner qu'ils sont tous de résoudre des problèmes communs dans le plus ou moins de la même manière. Si vous utilisez MSSQL avoir un regard sur le plan d'exécution est générée. Vous pouvez le faire en activant le générateur de profils et plans d'exécutions. Cela vous donnera une version texte lorsque vous exécutez la commande.
Je ne suis pas certain de la version de MYSQL que vous utilisez, mais vous pouvez obtenir un graphique dans SQL Server 2000 dans l'analyseur de requêtes. Je suis sûr que cette fonctionnalité n'est tapi quelque part dans SQL Server Studio Manager dans les versions ultérieures.
Ont un look à la exeuction plan. Autant que possible, éviter les analyses de la table, à moins bien sûr de votre table est petite dans ce cas, une analyse de la table est plus rapide que l'utilisation d'un index. Lire sur les différentes opérations de jointure que chaque scénario différent produit.
Ce Fil est assez vieux, mais encore souvent mentionnés. Pour mon goût personnel, c'est un peu incomplet, car il existe une autre manière de poser la base de données avec le mot-clé EXISTE que j'ai trouvé pour être plus rapide, plus souvent que non.
Donc, si vous êtes seulement intéressé par les valeurs du tableau a, vous pouvez utiliser cette requête:
La différence peut être énorme si le col n'est pas indexé, parce que la bd n'est pas de trouver tous les enregistrements de b qui ont la même valeur dans le col, il n'a qu'à trouver le tout premier. Si il n'y a pas d'index sur b.col et un grand nombre d'enregistrements dans b une analyse de table pourrait être la conséquence. Avec EN ou une JOINTURE ce serait un full table scan, avec EXISTE ne serait-ce que partielle d'un tableau de numérisation (jusqu'à ce que le premier enregistrement correspondant est trouvé).
Si il y a beaucoup de dossiers dans b qui ont le même col valeur vous aurez aussi perdre beaucoup de mémoire pour la lecture de tous ces documents dans un espace temporaire juste pour trouver que votre condition est satisfaite. Avec existe cela peut généralement être évitée.
J'ai souvent constaté EXISTE plus vite, même si il y a un index. Il dépend du système de base de données (l'optimiseur), les données et la dernière pas moins sur le type d'indice qui est utilisé.
L'optimiseur doit être assez intelligent pour vous donner le même résultat quel que soit la façon normale pour les requêtes. Vérifier le plan d'exécution et ils devraient vous donner la même chose. S'ils ne le font pas, je l'aurais fait normalement envisager de le REJOINDRE le plus rapidement possible. Tous les systèmes sont différents, cependant, de sorte que vous devrait profil le code sur votre système pour être sûr.