Hat die Reihenfolge der Tabellen wird in der ON-Klausel der JOIN-Sache?
Ist es egal, welchen Weg ich um die Kriterien, die in der ON-Klausel für eine VERKNÜPFUNG?
select a.Name, b.Status from a
inner join b
on a.StatusID = b.ID
versus
select a.Name, b.Status from a
inner join b
on b.ID = a.StatusID
Ist es, Auswirkungen auf die Leistung? Was, wenn ich mehrere Kriterien?
Ist eine um mehr wartbar ist als die andere?
Du musst angemeldet sein, um einen Kommentar abzugeben.
JOIN
Ordnung kann erzwungen werden, indem die Tabellen in der richtigen Reihenfolge in dieFROM
Klausel:MySQL hat eine spezielle Klausel nennt
STRAIGHT_JOIN
wodurch die Reihenfolge egal.Dieser wird ein index für
b.id
:Und dies wird einen index verwenden, der auf
a.StatusID
:Oracle hat einen ganz besonderen Tipp
ORDERED
zur Durchsetzung derJOIN
Reihenfolge:Dieser wird ein index für
b.id
oder erstellen Sie eine hash-Tabelle aufb
:Und dies wird einen index verwenden, der auf
a.StatusID
oder erstellen Sie eine hash-Tabelle aufa
:SQL Server hat einen Hinweis genannt
FORCE ORDER
das gleiche zu tun:Dieser wird ein index für
b.id
oder erstellen Sie eine hash-Tabelle aufb
:Und dies wird einen index verwenden, der auf
a.StatusID
oder erstellen Sie eine hash-Tabelle aufa
:PostgreSQL Jungs, tut mir Leid. Ihre TODO-Liste sagt:
Als für die Reihenfolge, in der der Vergleich, es ist egal, in jedem
RDBMS
, AFAIK.Obwohl ich persönlich versuche immer abzuschätzen, welche Spalte gesucht wird und diese Spalte in die linke (für die die es scheinen, wie eine
lvalue
).Sehen die Antwort für mehr detail.
ON
- Klausel und zeigt auch ein Beispiel, wo er nicht Umgekehrt die Tabellen, sondern nur dieON
-Klausel aber diese Antwort behandelt nur den Fall, dass die Tabelle-Reihenfolge Umgekehrt. Oder gibt der Letzte Kommentar "was die Reihenfolge im Vergleich...." finden Sie es?Nein das tut es nicht.
Was ich tun (für die Lesbarkeit) ist dein 2. Beispiel.
Nicht. Die Datenbank sollte die Bestimmung der best-execution-plan, basierend auf dem gesamten Kriterien, nicht, indem man schaut auf jedes Element in der Sequenz. Sie können dies überprüfen, durch das anfordern der Ausführungsplan für beide Abfragen, sehen Sie, dass sind die gleichen (Sie werden feststellen, dass selbst sehr unterschiedliche Abfragen, solange Sie letztlich wählen Sie die gleiche Logik, sind Häufig zusammengefasst zu den gleichen execution-plan).
Nein gibt es nicht. Am Ende des Tages, Sie sind wirklich einfach nur auswerten, ob a=b.
Und als die symmetrische Eigenschaft der Gleichheit besagt:
so, ob Sie schauen für
(12)*=12
oder12=(12)*
macht logisch keinen Unterschied.Wenn die Werte gleich sind, beitreten, wenn nicht, nicht. Und ob Sie Sie angeben, wie in deinem ersten Beispiel oder die zweite, das macht keinen Unterschied.
Wie viele gesagt haben: Der Auftrag nicht machen einen Unterschied im Ergebnis oder Leistung.
Was ich hinweisen möchte ist aber, dass LINQ to SQL erlaubt nur den ersten Fall!
Z.B. folgende Beispiel funktioniert gut, ...
... obwohl das werfen von Fehlern in Visual Studio:
Die wirft diese der compiler-Fehler:
Aber nicht relevant in standard-SQL-Codierung, dies ist möglicherweise ein Punkt zu beachten, wenn sich gewöhnenden sich entweder eine solche.
Lesen Sie diese
SQL Server enthält eine Optimierung für Situationen, die weit komplexer ist als diese.
Wenn Sie mehrere Kriterien für ein Zeug ist in der Regel faul zu bewerten (aber ich muss ein wenig Forschung tun um den Rand der Fälle, wenn vorhanden.)
Zur besseren Lesbarkeit habe ich in der Regel lieber
Ich denke, es macht mehr Sinn als Verweis auf die Variablen in der gleichen Reihenfolge wie Sie deklariert wurden, aber es ist wirklich eine persönliche Geschmackssache.
Der einzige Grund, ich würde nicht verwenden Sie Ihre zweite Beispiel:
Ihre Benutzer eher wieder kommen und sagen: 'Kann ich alle sehen das ein.name ist, auch wenn Sie keine status-Aufzeichnungen? "anstatt" Kann ich sehen, alle b.status, auch wenn Sie nicht haben einen Namen aufzeichnen?', so einfach planen Sie im Voraus für dieses Beispiel, das ich verwenden würde
On a.StatusID = b.ID
im Vorgriff auf ein LEFT Outer Join. Dies setzt Voraus, Sie haben könnte, Tabelle 'a' Datensatz ohne 'b'.Korrektur: Es wird nicht das Ergebnis verändern.
Dies ist wahrscheinlich ein strittiger Punkt, da die user sich nie ändern Ihre Anforderungen.
NÖ, spielt keine Rolle. aber hier ist ein Beispiel, um zu helfen machen Sie Ihre Abfragen leichter lesbar (zumindest für mich)
jede Tabelle eine Referenz auf eine separate Zeile und in jedem join-Kriterium wird auf einer separaten Zeile. die Tab-Taste hilft, was gehört zu dem, was gerade ist.
andere Sache ich mag zu tun ist, meine Kriterien in meine Aussagen fließen in der gleichen Reihenfolge wie in der Tabelle. so, wenn a zuerst und dann b, a wird auf der linken Seite und b auf der rechten Seite.
FEHLER: ON-Klausel auf Tabellen verweist, die zu seiner rechten (php sqlite 3.2)
Ersetzen Sie diese
Für diese