[linux-l] SQL

Robert C. Helling r.helling at iu-bremen.de
Mi Okt 18 21:40:16 CEST 2006


On Wed, 18 Oct 2006, Volker Grabsch wrote:

> On Tue, Oct 17, 2006 at 11:18:54PM +0200, Michael Kasten wrote:
>>> 	SELECT berufs_id FROM stellen  WHERE stellen_id = 1 ;
>>> 	SELECT berufsbezeichnung FROM beruf WHERE berufs_id = 1 ;
>>> Aber irgend wie lässt sich die Abfrage bestimmt so zusammen fassen,
>>
>> aus dem Handgelenk und ungetestet:
>>
>>           SELECT beruf.berufsbezeichnung, stellen.berufs_id
>>           FROM beruf
>>           LEFT JOIN stellen ON stellen.berufs_id = beruf.berufs_id
>>           WHERE stellen.stellen_id=1
>
> Nun, wir haben bisher zwei Lösungen jeweils zweimal gehabt.
> Einmal mit LEFT JOIN, und einmal ein SELECT auf zwei Tabellen
> gleichzeitig.
>
> Ich bevorzuge normalerweise letzteres, weil ich LEFT JOINs etwas
> umständlich finde und SELECTs auf mehrere Spalten ohnehin intern
> in entsprechende JOINs umgewandelt werden. Das ist aber nur die
> bescheidene Meinung eines Gelegenheits-SQL-Schreiber, der nur
> mäßig komplexe Dinge mit SQL anstellt und noch keine riesigen
> Datenbanken hatte.
>
> Was meint ihr dazu? Wo liegen die Vor- und Nachteile von expliziten
> JOINs? Wo liegen die Performance-Unterschiede? Was findet ihr
> übersichtlicher?
>
> Gibt es dabei wichtige Unterschiede zwischen MySQL und PostgreSQL?

Fuer solche Fragen gibt es ja EXPLAIN. Koennte der OP ja mal machen und 
posten. Und es sollte nicht nur von der Engine abhaengen sondern 
wesentlich auch davon, wie die Datenbank so aussieht. Eine halbwegs 
anstaendige Engine sollte sowieso beide Formen zu dem gleichen Statement 
optimieren.

Ich finde ja folgendes immerwieder erstaunlich: Wenn die beiden Tabellen N 
und M Elemente enthalten, wie skaliert dann die Ausfuehrungszeit? Naiv 
wuerde man denken O(MN): Ich gehe mit einer Schleife durch die erste 
Tabelle und fuer jedes Element mache ich eine Schleife ueber die zweite 
Tabelle und sehe, welche Elemente passen.

Asymptotisch kann man das aber besser machen: Vorher sortiere ich naemlich 
beide Tabellen nach der gemeinsamen Spalte, das dauert mit Quicksort
M log(M) + N log(N), dann kann ich die Tabellen "nebeneinander legen" und 
das durchsuchen nach Paaren dauert nur noch M+N. Daher ist dieses 
Verfahren wesentlich schneller fuer grosse M und N. Fuer keine M und N 
aber natuerlich nicht, da es mehr overhead hat.

Robert

-- 
.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oO
Robert C. Helling     School of Science and Engineering
                       International University Bremen
print "Just another   Phone: +49 421-200 3574
     stupid .sig\n";   http://www.atdotde.de


Mehr Informationen über die Mailingliste linux-l