Sven Rautenberg: Nachtrag

Beitrag lesen

Moin!

Also konkret sähe mein Anfrage folgendermaßen aus:
SELECT a.a, a.b, b.*, c.* FROM a, b, c WHERE a.a='x' AND a.b=b.b AND a.b=c.b

Das gibt dann eine Zeile zurück. Das sollte doch auch kein größerer Aufwand sein, als das ganze mit drei SELECT zu machen, oder? Aber bringt es nun einen Vorteil oder nicht?

Bei dieser Anfrage passiert folgendes: Es wird die gesamte Tabelle A genommen, jede Zeile dieser Tabelle wird verknüpft mit _allen_ Zeilen der Tabelle B (die entstehende Tabelle hat also soviele Zeilen, wie Tabelle A multipliziert mit Tabelle B Zeilen hat). Jede Zeile dieser Tabelle wird dann noch mit jeder Zeile der Tabelle C verknüpft, so daß am Ende eine Tabelle entstanden ist, die A x B x C Zeilen hat. Wenn jede deiner eizelnen Tabellen zehn Zeilen hat, dann entsteht eine Tabelle mit 10x10x10=1000 Zeilen. Hat jede Tabelle 100 Zeilen, entsteht eine Tabelle mit 100x100x100 = 1.000.000 Zeilen.

Und erst dann wird diese Tabelle durchsucht nach der Bedingung, die bei WHERE angegeben ist.

Ein Riesenaufwand, um die Tabelle aufzubauen - vor allem, wenn hinterher nur eine Zeile zu finden ist. Eine Million Zeilen durchsuchen, um eine Zeile zu finden, obwohl nur ein Kriterium (nämlich a.a='x') geprüft wird, ist Wahnsinn.

Aber man kann es besser machen:

SELECT a.a, a.b, b.*, c.* FROM a JOIN b ON a.b=b.b JOIN c ON a.b=c.b WHERE a.a='x'

Hier wird zunächst die komplette Tabelle A genommen, und jede Zeile wird nur mit den Zeilen aus Tabelle B verknüpft, für die die erste Bedingung hinter dem ersten ON zutrifft (wenn Spalte .b eine ID ist, werden als Ergebnis kaum mehr Zeilen rauskommen, als Tabelle A Zeilen hat). Die resultierende Tabelle wird auf die gleiche Weise mit Tabelle C verknüpft, was ebenfalls nicht mehr Zeilen ergeben dürfte, als Tabelle A ursprünglich Zeilen hatte.

Dann wird geschaut, wo die WHERE-Bedingung zutrifft. Statt einer Million Zeilen werden aber nur hundert Zeilen durchsucht (wenn die Annahmen von vorhin noch gelten). Bei großen Tabellen (stell' dir nur vor, du hast nicht 100 Zeilen in jeder Tabelle, sondern 100.000 oder eine Million) macht das einen entscheidenden Unterschied. ;)

Ansonsten ist eventuell zu prüfen, ob nicht drei SELECT-Statements schneller sind, als ein dreifacher JOIN. Richtig relevant wird das aber erst, wenn es um Performance geht (sollte deine Abfrage wirklich häufig vorkommen und große Tabellen durchsuchen).

- Sven Rautenberg