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

EXCEPT s'exécute-t-il plus rapidement qu'un JOIN lorsque les colonnes de la table sont identiques

Personne ne peut vous dire que EXCEPT surpassera toujours ou jamais un équivalent OUTER JOIN . L'optimiseur choisira un plan d'exécution approprié, quelle que soit la manière dont vous écrivez votre intention.

Cela dit, voici ma ligne directrice :

Utilisez EXCEPT quand au moins un de ce qui suit est vrai :

  1. La requête est plus lisible (ce sera presque toujours vrai).
  2. Les performances sont améliorées.

Et LES DEUX des affirmations suivantes sont vraies :

  1. La requête produit des résultats sémantiquement identiques, et vous pouvez le démontrer par des tests de régression suffisants, y compris tous les cas limites.
  2. Les performances ne sont pas dégradées (encore une fois, dans tous les cas extrêmes, ainsi que les changements environnementaux tels que l'effacement du pool de mémoire tampon, la mise à jour des statistiques, l'effacement du cache du plan et le redémarrage du service).

Il est important de noter qu'il peut être difficile d'écrire un EXCEPT équivalent requête en tant que JOIN devient plus complexe et/ou vous comptez sur des doublons dans une partie des colonnes mais pas dans d'autres. Écrire un NOT EXISTS équivalent, bien que légèrement moins lisible que EXCEPT devrait être beaucoup plus simple à accomplir - et conduira souvent à un meilleur plan (mais notez que je ne dirais jamais ALWAYS ou NEVER , sauf comme je viens de le faire).

Dans cet article de blog, je démontre au moins un cas où EXCEPT est surpassé à la fois par un LEFT OUTER JOIN correctement construit et bien sûr par un équivalent NOT EXISTS variation.