Daniela Koller: diffiziles SELECT

Beitrag lesen

Hi Sven

Nein, mache ich nicht. Das ist ja gerade der Trick mit dem ON-Statement: Es wird nicht das Kreuzprodukt (jede Zeile der einen Tabelle wird mit jeder anderen Zeile der anderen Tabelle verknüpft und dann rausgefiltert, was gewünscht ist) gebildet, sondern es werden nur die Verknüpfungen in die Ergebnistabelle gelegt, die der ON-Bedingung (geprüft vor der Verknüpfung) entsprechen.

Logisch bleibt es ein kartesisches Produkt, nur technisch ist es optimiert.
Für Performance hast du aber recht.

Wenn die Ergebnismenge die gleiche ist, wo liegt dann der Unterschied zwischen diesen beiden Formen ? Gibt es überhaupt einen Unterschied ?

Der Unterschied liegt in der Laufzeit. Im ersten Beispiel wird zuerst das kartesische Produkt aus beiden Tabellen gebildet (jede Zeile aus Tabelle1 wird mit jeder Zeile aus Tabelle2 verknüpft), und wenn beide Tabellen nur jeweils 100 Zeilen enthalten, sind das schon 10.000 Zeilen in der temporären Zwischentabelle. Erst dann werden die Zeilen gelöscht, die nicht die WHERE-Bedingung erfüllen."

Diese Information ist veraltet, das war früher bei Mysql mal so, inzwischen
(seit mehr als 1.5Jahren) wird auch Where genauso optimiert.

Scheint mir jedenfalls wesentlich besser zu sein, als mit WHERE zu arbeiten. Die MySQL-Doku (http://www.mysql.com/documentation/mysql/bychapter/manual_MySQL_Optimisation.html#LEFT_JOIN_optimisation) sagt zu den Optimierungen, die bei LEFT JOIN vorgenommen werden, allerdings, dass ON und WHERE gleich behandelt werden (alles in ON wird nach WHERE befördert und optimiert). Ich kann mir dann nicht vorstellen, dass MySQL sowas aufwendiges wie ein vollständiges kartesisches Produkt im Speicher anlegt, um mit WHERE Zeilen rauszufiltern, sondern die ganze Sache von vornherein optimiert.

Aber nur weil es schöner ist und näher am ISO-Standard liegt (der
wäre in dem Fall Natural Join tabellenname [USING (Spalte)] wobei das Using
nur der Übersicht dient und falls mehrere Spalten mit dem selben Namen
existieren.

Gruss Daniela