Das kann Ihnen niemand sagen EXCEPT
wird immer oder nie einen äquivalenten OUTER JOIN
übertreffen . Der Optimierer wählt unabhängig davon, wie Sie Ihre Absicht schreiben, einen geeigneten Ausführungsplan aus.
Das heißt, hier ist meine Richtlinie:
Verwenden Sie EXCEPT
wenn mindestens eine Folgendes gilt:
- Die Abfrage ist besser lesbar (das wird fast immer zutreffen).
- Die Leistung wurde verbessert.
Und BEIDE der folgenden sind wahr:
- Die Abfrage erzeugt semantisch identische Ergebnisse, und Sie können dies durch ausreichende Regressionstests einschließlich aller Grenzfälle nachweisen.
- Die Leistung wird nicht beeinträchtigt (wiederum in allen Randfällen sowie bei Umgebungsänderungen wie dem Löschen des Pufferpools, dem Aktualisieren von Statistiken, dem Löschen des Plan-Cache und dem Neustarten des Dienstes).
Es ist wichtig zu beachten, dass es eine Herausforderung sein kann, einen äquivalenten EXCEPT
zu schreiben Abfrage als JOIN
komplexer wird und/oder Sie sich auf Duplikate in einem Teil der Spalten verlassen, aber nicht in anderen. Schreiben eines NOT EXISTS
gleichwertig, aber etwas weniger lesbar als EXCEPT
sollte weitaus trivialer zu bewerkstelligen sein - und wird oft zu einem besseren Plan führen (aber beachten Sie, dass ich niemals ALWAYS
sagen würde oder NEVER
, außer wie ich es gerade getan habe).
In diesem Blogbeitrag demonstriere ich mindestens einen Fall, in dem EXCEPT
wird sowohl von einem richtig konstruierten LEFT OUTER JOIN
übertroffen und natürlich durch ein entsprechendes NOT EXISTS
Variante.