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 :
- La requête est plus lisible (ce sera presque toujours vrai).
- Les performances sont améliorées.
Et LES DEUX des affirmations suivantes sont vraies :
- 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.
- 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.