J'ai un cas où l'utilisation d'un JOIN ou d'un IN me donnera les bons résultats ... Qui a généralement de meilleures performances et pourquoi? Dans quelle mesure cela dépend-il du serveur de base de données que vous utilisez? (Pour info j'utilise MSSQL)
sql
sql-server
performance
tsql
Polaris878
la source
la source
Réponses:
De manière générale,
IN
ilJOIN
existe différentes requêtes qui peuvent donner des résultats différents.n'est pas la même chose que
, sauf s'il
b.col
est unique.Cependant, c'est le synonyme de la première requête:
Si la colonne de jonction est
UNIQUE
et marquée comme telle, ces deux requêtes génèrent le même plan dansSQL Server
.Si ce n'est pas le cas, alors
IN
c'est plus rapide queJOIN
surDISTINCT
.Voir cet article dans mon blog pour plus de détails sur les performances:
IN
vs.JOIN
vs.EXISTS
la source
IN
impliqueDISTINCT
.SQL Server
est assez intelligent pour le remarquer et générera les mêmes plans pour les deux requêtes. Je ne sais pas comment les autresRDBMS
se comporteront.C'est drôle que vous le mentionniez, j'ai fait un article de blog sur ce sujet même.
Voir Oracle vs MySQL vs SQL Server: agrégation vs jointures
Réponse courte: vous devez le tester et les bases de données individuelles varient beaucoup.
la source
C'est assez difficile à dire - pour vraiment savoir lequel fonctionne le mieux, vous devez réellement profiler les temps d'exécution.
En règle générale, je pense que si vous avez des index sur vos colonnes de clé étrangère, et si vous utilisez uniquement (ou principalement) des conditions INNER JOIN, alors le JOIN sera légèrement plus rapide.
Mais dès que vous commencez à utiliser OUTER JOIN, ou si vous manquez d'index de clé étrangère, IN peut être plus rapide.
Marc
la source
Un article intéressant sur les différences logiques: SQL Server: JOIN vs IN vs EXISTS - la différence logique
Je suis presque sûr qu'en supposant que les relations et les index sont maintenus, une jointure fonctionnera mieux dans l'ensemble (plus d'efforts sont consacrés à cette opération par rapport aux autres). Si vous y réfléchissez conceptuellement, c'est la différence entre 2 requêtes et 1 requête.
Vous devez le connecter à l'Analyseur de requêtes et l'essayer et voir la différence. Consultez également le plan d'exécution des requêtes et essayez de minimiser les étapes.
la source
Ce fil est assez ancien mais toujours mentionné souvent. Pour mon goût personnel, c'est un peu incomplet, car il existe une autre façon de demander à la base de données avec le mot-clé EXISTS que j'ai trouvé plus rapide le plus souvent.
Donc, si vous n'êtes intéressé que par les valeurs de la table a, vous pouvez utiliser cette requête:
La différence peut être énorme si col n'est pas indexé, car la base de données n'a pas besoin de trouver tous les enregistrements dans b qui ont la même valeur dans col, il doit seulement trouver le tout premier. S'il n'y a pas d'index sur b.col et que beaucoup d'enregistrements dans l'analyse de la table ba peuvent en être la conséquence. Avec IN ou un JOIN, ce serait un balayage complet de la table, avec EXISTS ce ne serait qu'un balayage partiel de la table (jusqu'à ce que le premier enregistrement correspondant soit trouvé).
S'il y a beaucoup d'enregistrements dans b qui ont la même valeur col, vous gaspillerez également beaucoup de mémoire pour lire tous ces enregistrements dans un espace temporaire juste pour constater que votre condition est satisfaite. Avec existe, cela peut être généralement évité.
J'ai souvent trouvé EXISTS plus rapide que IN même s'il y a un index. Cela dépend du système de base de données (l'optimiseur), des données et surtout du type d'index utilisé.
la source
L'implémentation de chaque base de données, mais vous pouvez probablement deviner qu'elles résolvent toutes les problèmes courants plus ou moins de la même manière. Si vous utilisez MSSQL, jetez un œil au plan d'exécution généré. Vous pouvez le faire en activant le profileur et les plans d'exécution. Cela vous donnera une version texte lorsque vous exécuterez la commande.
Je ne sais pas quelle version de MSSQL vous utilisez, mais vous pouvez en obtenir une graphique dans SQL Server 2000 dans l'analyseur de requêtes. Je suis sûr que cette fonctionnalité se cache quelque part dans SQL Server Studio Manager dans les versions ultérieures.
Jetez un œil au plan d'exeuction. Dans la mesure du possible, évitez les analyses de table à moins bien sûr que votre table ne soit petite, auquel cas une analyse de table est plus rapide que d'utiliser un index. Renseignez-vous sur les différentes opérations de jointure produites par chaque scénario différent.
la source
L'optimiseur doit être suffisamment intelligent pour vous donner le même résultat dans les deux cas pour les requêtes normales. Vérifiez le plan d'exécution et ils devraient vous donner la même chose. Si ce n'est pas le cas, je considérerais normalement que le JOIN est plus rapide. Cependant, tous les systèmes sont différents, vous devez donc profiler le code sur votre système pour en être sûr.
la source