inner join vs. left join
dr.colossos
- datenbank
1 Ilja0 dr.colossos0 ChrisB0 dr.colossos0 Ilja0 dr.colossos0 Ilja0 Vinzenz Mai0 Ilja
Hi,
kann mir jemand was sagen zum Performance-Unterschied zwischen inner joins (d.h. i.d.R. equi-joins) und left joins?
Ich kann ja jeden equi-join in einen left join umbauen. Mich wuerde interessieren, was davon performanter ist ... Datenbank-System uebergreifend wenn da jemand Bescheid weis.
Ich vermute mal, dass der jeweilige Query Optimizer die Query ohnehin in das von DB-System performanter eingeschaetzte "Format" bringt, aber das ist nur meine Vermutung.
Der equi-join kann schnell mit hash joins errechnet werden, aber davor wird ja immer (?) das gesamte Kreuzprodukt errechnet.
Will jemand seine Meinung mit mir teilen?
Danke
yo,
Ich kann ja jeden equi-join in einen left join umbauen.
mal von der performance abgesehen, ist dieser schluss einfach falsch. wie kommst du darauf, dass du damit fachlich das gleiche ergebnis bekommst ?
Ilja
Hi,
"... fachlich das gleiche ergebnis ..."
Was meinst den mit "fachlich".
Aber ich geb dir recht, dass ich mit "gleiche Ergebnis" nicht richtig liege, da mir der left-join ja u.U. mehr Resultate bringt als der striktere equi-join.
Performance-maessig eine Meinung ..?
Hi,
Aber ich geb dir recht, dass ich mit "gleiche Ergebnis" nicht richtig liege, da mir der left-join ja u.U. mehr Resultate bringt als der striktere equi-join.
Performance-maessig eine Meinung ..?
Wenn dir obiges schon klar ist - wieso fragst du dann jetzt noch mal nach einem Aepfel-mit-Birnen-Vergleich?
MfG ChrisB
Hallo,
weil ich, wie bereits anemerkt, equi-joins auch als left joins implementieren kann, und die Ergebnismenge kann durchaus identisch sein (5 Aepfel vs. 5 Aepfel).
Erstere basieren immer auf einem Kreuz-Produkt, zweitere arbeiten mit komplexen Join-Algorithmen.
Die Vermutung liegt nahe, dass aber eine gewissen Datenmenge der left join dem equi join davon rennt, aber sicher bin ich mir da nicht.
Danke
yo,
weil ich, wie bereits anemerkt, equi-joins auch als left joins implementieren kann, und die Ergebnismenge kann durchaus identisch sein (5 Aepfel vs. 5 Aepfel).
nein, das kannst du nicht, darauf wollen wir dich hinweisen. selbst wenn die "scheinbar" gleiche ergebnismenge bekommst, so ist es fachlich nicht das gleiche.
Ein beispiel, warum man das nicht machen kann, wenn ich zwei abfragen habe:
SELECT spalte1, spalte2 FROM tabelle WHERE spalte1 = 1;
SELECT spalte1, spalte2 FROM tabelle WHERE spalte2 = 3;
und siese beiden mir das gleiche ergebnis liefern, kann ich ise trotzdem nicht gegeneinander austauschen, weil sich fachlich ganz andere dinge tun.
Und wenn man das verstanden hat, dan hat man auch keine wahl mehr zwischen inner join und outer join. und wenn man keine wahl mehr hat, dann werden äpfel mit birnen verglichen....
Ilja
Hi,
tut mir leid, entweder verstehe ich euch nicht richtig oder ihr mich nicht richtig.
Natuerlich KANN mir der LEFT JOIN mehr Datensatze liefern, wenn aber bei den join-Partnern alle "Assoziationen" zutreffen, dann sind die Ergebnismengen gleich.
Es gibt ja auch die INNER JOIN Klausel. MSSQL kann das schon lang, ist aber evtl. kein Standard, ich hab mir wegen ORACLEs alter join-Syntax halt die implizite Schreibweise des inner-joins angewohnt.
Evtl. laesst sich meine Frage damit besser beantworten.
Sollte man einen impliziten join schreiben, oder explizit mit inner join, oder is das nur Syntax und intern ohnehin das gleiche ...
Ums auf den Punkt zu bringen. Was mich stoert ist das Kreuzprodukt, das angeblich beim equi-join (implizit) immer berechnet wird.
Lieg ich da mit meiner Info falsch, oder trifft das zu, und wenn's zu trifft, wie gehe ich bei grossen Tabellen am besten damit um?
Danke
yo,
Natuerlich KANN mir der LEFT JOIN mehr Datensatze liefern, wenn aber bei den join-Partnern alle "Assoziationen" zutreffen, dann sind die Ergebnismengen gleich.
so entwickelt man aber keine abfragen, sondern man sagt, was man haben will, unabhängig von dem ergebnis, was man bekommt.
Es gibt ja auch die INNER JOIN Klausel. MSSQL kann das schon lang, ist aber evtl. kein Standard, ich hab mir wegen ORACLEs alter join-Syntax halt die implizite Schreibweise des inner-joins angewohnt.
seit oracle 9i kann auch oracle den standard von expliziten joins und den sollte man sich auch angewöhnen, liest sich einfach viel besser.
Sollte man einen impliziten join schreiben, oder explizit mit inner join, oder is das nur Syntax und intern ohnehin das gleiche ...
mal von inner und outer join abgesehen, gibt es bei der ausführung keinen unterschied für das dbms. es geht dabei aber um lesbarkeit der abfragen.
Ums auf den Punkt zu bringen. Was mich stoert ist das Kreuzprodukt, das angeblich beim equi-join (implizit) immer berechnet wird.
es würde mich wundern, wenn bei einer impiziten schreibweise des inner joins ein anderer weg genommen wird als beim expliziten, wohl gemerkt, wenn beide inner joins sind.
Ilja
Hallo
Ums auf den Punkt zu bringen. Was mich stoert ist das Kreuzprodukt, das angeblich beim equi-join (implizit) immer berechnet wird.
Lieg ich da mit meiner Info falsch, oder trifft das zu, und wenn's zu trifft, wie gehe ich bei grossen Tabellen am besten damit um?
Ja, Du solltest falsch liegen. Grundsätzlich solltest Du das Werkzeug Deines
DBMS zum Ausführungsplan befragen, z.B. EXPLAIN.
Um es auf den Punkt zu bringen:
Mit OUTER JOINS kannst Du das Ergebnis verfälschen. Ich würde mich wundern, wenn
es bei gleicher Ergebnismenge zu Performanceunterschieden käme (bei ansonsten exakt gleichem Statement).
Ein Lesetipp zur Verfälschung:
Variation der Reihenfolge
Freundliche Grüße
Vinzenz
yo,
Ich würde mich wundern, wenn
es bei gleicher Ergebnismenge zu Performanceunterschieden käme (bei ansonsten exakt gleichem Statement).
mich würde es nicht wundern, jde noch so kleine änderung kann erhebliche auswirkungen haben.
Ilja