Parmi certains développeurs SQL Server, c'est une croyance largement répandue qui NOT IN
est terriblement lente , et les requêtes doivent être réécrites afin qu'elles renvoient le même résultat mais n'utilisent pas les mots clés "mauvais". ( exemple ).
Y a-t-il une vérité à cela?
Existe-t-il, par exemple, un bogue connu dans SQL Server (quelle version?) Qui fait que les requêtes utilisant NOT IN
ont un plan d'exécution pire qu'une requête équivalente qui utilise
- un
LEFT JOIN
combiné avec unNULL
chèque ou (SELECT COUNT(*) ...) = 0
dans laWHERE
clause?
IN
/NOT IN
sera toujours implémenté avec des boucles imbriquées. Et je n'ai aucune idée de ce quistops SQL Server from creating a ‘plan’
est censé signifier.Réponses:
Je ne pense pas que cela ait à voir avec le fait d'être terriblement lent; cela a à voir avec le fait d'être potentiellement inexact. Par exemple, compte tenu des données suivantes - commandes pouvant être passées soit par un client individuel, soit par un partenaire B2B:
Disons que je veux trouver tous les clients qui n'ont jamais passé de commande. Compte tenu des données, il n'y en a qu'un: le client n ° 2. Voici trois façons de rédiger une requête pour trouver ces informations (il y en a d'autres):
Résultats:
Maintenant, il y a aussi des problèmes de performances, et j'en parle dans ce blog . En fonction des données et des index,
NOT EXISTS
il surclasse généralement les performancesNOT IN
, et je ne sais pas si cela pourrait se dégrader. Vous devez également noter que celaEXCEPT
peut introduire une opération de tri distincte, vous pouvez donc vous retrouver avec des données différentes (encore une fois, selon la source). Et que leLEFT OUTER JOIN ... WHERE right.column IS NULL
modèle populaire est toujours le moins performant.Martin Smith a également beaucoup de bonnes informations à l'appui dans sa réponse sur SO .
la source