Antwort
 
Themen-Optionen Thema durchsuchen
Alt 11.06.2006, 23:41 Nach oben    #1
Erfahrener Benutzer
 
Registriert seit: 28.08.2004
Ort: konstanz am bodensee
Beiträge: 190
Standard generelle optimierung von joins

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
  • customer
  • article
  • orders
  • order_position

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
;
2.)
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
;
welche methode ist die bessere?
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
beny_mcde ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 11.06.2006, 23:53 Nach oben    #2
me pro ok?
 
Benutzerbild von Lars
 
Registriert seit: 07.09.2005
Ort: Pulheim bei Köln
Beiträge: 964
Standard

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.
Lars ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 12.06.2006, 02:45 Nach oben    #3
Waq
Erfahrener Benutzer
 
Registriert seit: 18.08.2005
Beiträge: 108
Standard

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.
Waq ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 12.06.2006, 20:19 Nach oben    #4
Jay
Gast
 
Beiträge: n/a
Standard

Ich hab das was Lars geschrieben hat auch mal irgendwo gelesen, allerdings trifft das so viel ich noch weiß nur auf ältere MySQL Datenbanken zu und wirklich nur auf MySQL.
 
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 12.06.2006, 20:29 Nach oben    #5
Waq
Erfahrener Benutzer
 
Registriert seit: 18.08.2005
Beiträge: 108
Standard

Das muss ein anderer Kontext oder ein sehr altes MySQL gewesen sein, ich benutze MySQL seit fast 7 Jahren...
Waq ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 12.06.2006, 21:20 Nach oben    #6
Erfahrener Benutzer
 
Registriert seit: 28.08.2004
Ort: konstanz am bodensee
Beiträge: 190
Standard

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.
beny_mcde ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 12.06.2006, 21:38 Nach oben    #7
Jay
Gast
 
Beiträge: n/a
Standard

@beny_mcde
Genau!

Naja ich würde mal sagen es ist egal. Wahrscheinlich ist dein erste Vorschlag (Thetastil genannt) besser geeignet, weil er einfacher zu generieren ist.

MfG Jay
 
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 13.06.2006, 06:12 Nach oben    #8
Lutz
 
Benutzerbild von MrNiceGuy
 
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 688
Standard

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:
$query = new query ('tabellenname''feld1=1 AND feld2=2');
$query->join ('INNER JOIN''tabelle2''tabelle2.feld1=tabelle1.feld1');
$query->join ('INNER JOIN''tabelle3''tabelle3.feld2=tabelle2.feld2');

$query->generate (); 
Nur als kleines Beispiel.
__________________
Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll
MrNiceGuy ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
PingBacks sind an
RefBacks sind aus

Ä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


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:03 Uhr.


Powered by vBulletin® Version 3.7.4 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45