RDBMS "schreiben" Abfragen neu, um sie zu optimieren, also hängt es vom System ab, das Sie verwenden, und ich würde annehmen, dass sie am Ende die gleiche Leistung auf den meisten "guten" Datenbanken liefern.
Ich schlage vor, dasjenige auszuwählen, das klarer und leichter zu pflegen ist, für mein Geld ist das das erste. Es ist viel einfacher, die Unterabfrage zu debuggen, da sie unabhängig ausgeführt werden kann, um die Integrität zu überprüfen.
nicht korrelierte Unterabfragen sind in Ordnung. Sie sollten mit dem gehen, was die Daten beschreibt, die Sie wollen. Wie bereits erwähnt, wird dies wahrscheinlich in den gleichen Plan umgeschrieben, ist aber nicht garantiert! Wenn Tabelle A und B nicht 1: 1 sind, erhalten Sie doppelte Tupel von der Join-Abfrage (da die IN-Klausel eine implizite DISTINCT-Sortierung durchführt). Daher ist es immer am besten, zu codieren und tatsächlich über das Ergebnis nachzudenken.
Nun, es hängt von den Datensätzen ab. Aus meiner Erfahrung, wenn Sie kleine Datenmenge haben, dann gehen Sie für ein NICHT, wenn es groß ist, gehen Sie für eine LINKE VERBINDUNG. Die NOT IN-Klausel scheint in großen Datenmengen sehr langsam zu sein.
Eine andere Sache, die ich hinzufügen könnte, ist, dass die EXPLAIN-Pläne irreführend sein könnten. Ich habe mehrere Abfragen gesehen, bei denen explain sky high war und die Abfrage unter 1s ausgeführt wurde. Auf der anderen Seite habe ich Abfragen mit ausgezeichneten Plan zu sehen und sie konnten stundenlang laufen.
Also alles in allem testen Sie Ihre Daten und sehen Sie selbst.
Ich gebe Toms Antwort, dass Sie die leichter zu verstehen und zu pflegen wählen sollten.
Der Abfrageplan jeder Abfrage in einer Datenbank kann nicht vorhergesagt werden, weil Sie uns keine Indizes oder Datenverteilungen gegeben haben. Die einzige Möglichkeit, schneller vorherzusagen, ist, sie gegen Ihre -Datenbank auszuführen.
Als Faustregel tendiere ich dazu, Unterselektionen zu verwenden, wenn ich keine Spalten aus tblB in meine select-Klausel einfügen muss. Ich würde definitiv für eine Sub-Auswahl gehen, wenn ich das 'in' Prädikat (und in der Regel für die 'nicht in', die Sie in der Frage enthalten) verwenden, aus dem einfachen Grund, dass diese leichter zu verstehen sind, wenn Sie oder jemand sonst ist zurückgekommen und verändert sie.
Ich habe eine einfache Abfrage ähnlich der MSSQL2005-Frage erstellt und die EXPLAIN-Pläne waren unterschiedlich. Die erste Abfrage scheint schneller zu sein. Ich bin kein SQL-Experte, aber der geschätzte EXPLAIN-Plan hatte 37% für Abfrage 1 und 63% für Abfrage 2. Es scheint, dass die größten Kosten für Abfrage 2 der Join sind. Beide Abfragen hatten zwei Tabellen-Scans.
Tags und Links sql sql-server database performance