subselect vs Outer Join

8

Betrachten Sie die folgenden 2 Abfragen:

%Vor%

Was wird besser funktionieren? Meine Annahme ist, dass der Join im Allgemeinen besser ist, außer in Fällen, in denen der Subselect eine sehr kleine Ergebnismenge zurückgibt.

    
shsteimer 06.09.2008, 13:05
quelle

8 Antworten

16

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.

    
Tom 06.09.2008, 13:17
quelle
4

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.

    
Andy Irving 15.09.2008 16:29
quelle
3

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.

    
Piotr Anders 16.09.2008 08:30
quelle
2

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.

    
andy47 07.09.2008 08:35
quelle
1

Die erste Abfrage wird in SQL Server schneller sein, was meiner Meinung nach intuitiv leicht ist - Sub-Abfragen scheinen wie sie langsamer sein sollten. In einigen Fällen (wenn das Datenvolumen zunimmt) kann ein exists schneller sein als ein in .

    
Martynnw 11.09.2008 21:49
quelle
1

Es sollte beachtet werden, dass diese Abfragen unterschiedliche Ergebnisse liefern, wenn TblB.a nicht eindeutig ist.

    
Amy B 15.09.2008 17:35
quelle
0

Aus meinen Beobachtungen erstellt der MSSQL-Server den gleichen Abfrageplan für diese Abfragen.

    
aku 06.09.2008 13:08
quelle
0

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.

    
Mike Polen 06.09.2008 13:16
quelle