![]() |
|
|
Themen-Optionen |
|
|
Nach oben #1 |
|
Erfahrener Benutzer
Registriert seit: 28.08.2004
Ort: konstanz am bodensee
Beiträge: 190
|
moin, ich suche die beste (also elegenteste und schnellste) art joins auf eine sql datenbank durchzuführen.
im allgemeinen gibt es ja mehrere möglichkeiten. ich habe eine kleine beispieldatenbank in der man bestellprozesse ablegen kann. sie besteht aus den tabellen
nun will ich also alle kundenname, artikelname und anzahl der bestellten artikel aus der bestellung mit der id 1. es gibt ja nun mehrere möglichkeiten das umzusetzen. 1.) Code:
SELECT
c.name, a.name, p.count
FROM
customer c, article a, orders o, order_position p
WHERE
o.id=1
AND o.customerID = c.id
AND p.orderID = o.id
AND p.articleID = a.id
;
Code:
SELECT
c.id,
c.name,
a.name,
p.count
FROM
customer c
INNER JOIN
(orders o,order_position p,article a)
ON
(c.id=o.customerID
AND p.orderID=o.id
AND p.articleID = a.id)
WHERE o.id=1
;
mir persöhnlich gefällt die 2te besser und ich glaube das ist auch ein besserer stiel. gibt es vieleicht noch andere schreibweisen um das selbe ergebnis zu erziehlen? mfg beny |
|
|
|
|
|
Nach oben #2 |
|
me pro ok?
Registriert seit: 07.09.2005
Ort: Pulheim bei Köln
Beiträge: 964
|
JOINs sind immer schneller. Bei ersterer Methode werden erst alle Kombinationen gelesen und dann gefiltert, beim JOIN wird beim Lesen schon gefiltert.
Hat man alsi zwei Tabellen mit je hundert Datensätzen, hat man Methode 1 nach dem Lesen eine zwischenzeitliche Speicherbelastung von 10.000 Datensätzen, beim JOIN werden nur die zwischengespeichert, die wirklich passen.
__________________
Gedanken aus Draht stricken einen Zaun. |
|
|
|
|
|
Nach oben #3 |
|
Erfahrener Benutzer
Registriert seit: 18.08.2005
Beiträge: 108
|
Variante 1 und 2 machen gerne mal genau dasselbe.
Einziger echter Unterschied ist eigentlich, dass bei Variante 1 der Join-Optimizer entscheidet, wie rum der Inner Join aufgebaut wird, wobei er in diesem Fall glaube ich gar keine andere Wahl hätte, als es richtig zu machen. Bei komplexeren Joins hat der aber durchaus Entscheidungsspielraum, und wenn der Optimizer sich im laufenden Betrieb entscheidet, den Join mal andersrum aufzubauen, und da keine passenden Indizes draufliegen, kann das übel krachen. Hab ich mal gesehen, da brauchte eine Abfrage auf einmal statt 0,02 Sekunden ganze 20 Minuten. Wobei man den Optimizer über "STRAIGHT_JOIN" auch zähmen kann, dann nimmt er die im Query vorgegebene Reihenfolge der Tabellen. PS: Was Lars geschrieben hat stimmt AFAIK nicht. Kannst ja mal nen Benchmark machen, welche variante schneller ist, IMHO sollte es keinen Unterschied geben. |
|
|
|
|
|
Nach oben #6 |
|
Erfahrener Benutzer
Registriert seit: 28.08.2004
Ort: konstanz am bodensee
Beiträge: 190
|
also welche variante sollte man nun verwenden.
es geht darum die sql abfragen automatisch zu generieren, das ist ja in 1. einfacher, da alle tabellennamen im FROM teil stehen. wenn man JOIN verwendet darf ja eine tabelle die im join angegeben ist nicht mehr im FROM teil stehen. das mit den großen zwischentabellen die bei variante 1 entstehen hab ich auch mal irgendwann irgendwo gelesen. aber man weiß ja meistens nicht wie aktuell so eine information ist. ausserdem geistert im web ja auch eine menge halbwissen herum das von selbsternannten professoren publiziert wird. |
|
|
|
|
|
Nach oben #8 |
|
Erfahrener Benutzer
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 662
|
Das einzige, was ich hier als "schwieriger" bei der Erschaffung des Queries sehe, ist der "ON"-Part. ABER: Da die Bedingung ja so oder so in der "WHERE"-Klausel stehen muss, kann man sich auch die Mühe machen und einfach den entsprechenden Teil in den "ON"-Part packen, so schwierig ist das wirklich nicht. Wenn du das zum Beispiel in einer Klasse lösen willst, wäre für mich folgendes recht ansprechend:
PHP-Code:
__________________
Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll |
|
|
|
![]() |
| Lesezeichen |
| Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
| Themen-Optionen | |
|
|
Ähnliche Themen
|
||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| [Suche] anleitung für Joins - mySql | bob | Gesuche | 2 | 08.11.2006 18:10 |
| Leidiges Thema: JOINS | thesecondjoker | Datenbanken | 9 | 21.04.2006 16:26 |