Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wird EXCEPT schneller ausgeführt als ein JOIN, wenn die Tabellenspalten gleich sind

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:

  1. Die Abfrage ist besser lesbar (das wird fast immer zutreffen).
  2. Die Leistung wurde verbessert.

Und BEIDE der folgenden sind wahr:

  1. Die Abfrage erzeugt semantisch identische Ergebnisse, und Sie können dies durch ausreichende Regressionstests einschließlich aller Grenzfälle nachweisen.
  2. 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.