SQL Left Outer Join und Laufzeit

Vacca

Cadet 4th Year
Registriert
Apr. 2007
Beiträge
78
Hallo Zusammen,

ich bin zwar nicht ungeübt mit SQL, aber ich wollte Euch fragen, welche Methode in bezug auf eine möglichst gute Laufzeit das beste ist.

Stellt Euch folgendes (vereinfaches abstraktes Beispiel) vor: Ein Einkaufszettel mit Stationen und je nach Staion unterschiedliche Einträge in unterschiedlicher Anzahl (0 bis ...).

Tabelen:
Tabelle LADEN (LadenName*, Route, Ort, Typ, usw.)
Tabelle ARTIKEL (LadenName*, Bezeichnung*, Preis, usw.)
* = Schlüssel
-> Es ist also so, daß ein Artikel genau einem Laden zugeordnet ist.
-> Der Einfachheit halber ist ein Laden auch genau einer Route zugeordnet.

Also könnte so was dabei rauskommen (es sollen auch die Stationen erscheinen, wo keine Artikel gefunden werden):
Aldi
- Mehl
- Honig
Karstadt
Rewe
Saturn
- Windows 7

So, und nun kann man das ganze mit einem LEFT OUTER JOIN machen:
Code:
SELECT * FROM 
(SELECT * 
FROM laden
WHERE route = 1) AS laden1
LEFT OUTER JOIN
(SELECT * 
FROM artikel) AS artikel1
ON laden1.LandenName = artikel1.LadenName

Wenn ich jetzt nur nach einer Einkaufsroute abfrage, werden ja in der zweiten Abfrage (artikel1) auch die Artikel ausgewählt, die zu anderen Routen gehören - was ziemlich lange dauern könnte. :(
Andererseits könnte ich in der zweiten Abfrage noch mal eine Tabellenverknüpfung mit "Laden" machen, um schon nur die Artiekel herauszuholen, die nur zu der Route gehören. Das kostet aber auch Zeit. :(
Kann man das auch irgendwie mit IN machen?

Ich hoffe, ich habe das verständlich beschrieben. ;)


Danke im Voraus,
der Vacca
 
Also normal macht man das so:
Code:
SELECT * FROM 
laden
LEFT OUTER JOIN artikel
ON laden.LadenName = artikel.LadenName
Where laden.route = 1
Wenn du keine enormen Bestände an Daten hast (100.000ende Läden) sollte das auch ausreichend schnell sein. Falls du tatsächlich in solche Größenordnungen kommst spielt da viel der jeweilige Optimizer des Datenbanksystems mit rein und der ist abhängig davon welche Datenbank du denn einsetzt, welche Partitionierung evtl. besteht usw.
Im Übrigen wäre es evtl. auch performanter, numerische IDs für den Join zu verwenden anstatt Strings.
 
Hallo BerniG,

danke für Deine Hilfe! :) So sieht es schon besser aus - wobei ich in der zweiten Artikel-Abfrage noch eine WHERE Bedingung eingebaut habe.

Es handelt sich bei dem ganzen um eine MySQL Datenbank und in beiden Tabellen sind so ca. 1500 Sätze. Der Verbund erfolgt über numerische Spalten, habe es hier nur mal vereinfacht dargestellt. :freaky:


Der Vacca
 
Zurück
Oben