Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Performances SQL sur LEFT OUTER JOIN vs NOT EXISTS

Le lien de Joe est un bon point de départ. Quassnoi couvre cela aussi.

En général, si vos champs sont correctement indexés, OU si vous prévoyez de filtrer plus d'enregistrements (c'est-à-dire avoir beaucoup de lignes EXIST dans la sous-requête) NOT EXISTS fonctionnera mieux.

EXISTS et NOT EXISTS les deux court-circuit - dès qu'un enregistrement correspond aux critères, il est soit inclus, soit filtré et l'optimiseur passe à l'enregistrement suivant.

LEFT JOIN rejoindra TOUS LES RECORDS indépendamment du fait qu'ils correspondent ou non, puis filtrez tous les enregistrements qui ne correspondent pas. Si vos tables sont grandes et/ou vous avez plusieurs JOIN critères, cela peut être très gourmand en ressources.

J'essaie normalement d'utiliser NOT EXISTS et EXISTS lorsque c'est possible. Pour SQL Server, IN et NOT IN sont sémantiquement équivalents et peuvent être plus faciles à écrire. Ce sont parmi les seuls opérateurs que vous trouverez dans SQL Server qui sont garantis contre les courts-circuits.