147 votes

Ce qui ' la différence entre pas EXISTS vs NOT IN vs gauche Rejoignez où est NULL ?

Il me semble que vous pouvez faire la même chose dans une requête SQL n'utilisant pas EXISTS, NOT IN ou LEFT JOIN où est NULL. Par exemple :

Je ne sais pas si j’ai eu toute la syntaxe correcte, mais ce sont les techniques générales que j’ai vu. Pourquoi j’ai choisi d’utiliser l’un sur l’autre ? Performance se distingue-t-elle... ? Lequel d'entre eux est le plus rapide / plus efficace ? (Si cela dépend de la mise en œuvre, quand j’ai utiliser chacun d’eux ?)

135voto

Quassnoi Points 191041

En un mot:

NOT IN est un peu différent: il ne correspond jamais avec si il n'y a qu'un seul NULL dans la liste.

  • En MySQL, NOT EXISTS est un peu moins efficace

  • En SQL Server, LEFT JOIN / IS NULL est de moins en moins efficace

  • En PostgreSQL, NOT IN est de moins en moins efficace

  • En Oracle, les trois méthodes sont les mêmes.

5voto

Guffa Points 308133

Si la base est bonne à l'optimisation de la requête, les deux premiers seront transformés en quelque chose de proche de la troisième.

Pour les situations simples comme ceux de vous remettre en question, il devrait y avoir peu ou pas de différence, car ils seront exécutées que les jointures. Dans des requêtes plus complexes, la base de données peut ne pas être en mesure de faire une jointure de l' not in et not exists queryes. Dans ce cas, les requêtes obtiendrez beaucoup plus lent. D'autre part, une jointure peut également effectuer mal si il n'y a aucun indice qui peut être utilisé, de sorte que juste parce que vous utilisez une jointure ne veut pas dire que vous êtes en sécurité. Vous devez examiner le plan d'exécution de la requête pour savoir si il peut y avoir aucun problème de performances.

0voto

baleks Points 1

Quand besoin d’insérer des données dans la table avec clé primaire pluridisciplinaire, considère qu’il sera beaucoup plus rapide (j’ai essayé dans Access mais je pense que dans une base de données), pas pour vérifier que « n'existe pas records avec « ces » valeurs en table », - plutôt simplement insérer dans la table et les enregistrements excès (par th touche e) ne sera pas inséré deux fois.

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