SQL-Select: Joins optimieren = schneller machen?
-
Ich habe in einer Select-Anweisung mehrere Tabellen über Joins verknüpft. Bei vielen Datensätzen dauert die Select-Anweisung fürchterlich lange. Splitte ich die Anweisung in mehrere Selectanweisungen auf, gehts wieder schneller. Das finde ich aber wenig gelungen. Kann man die eine Selectanweisung irgendwie geschwindigkeitsoptimieren?
-
da muesste man schon die select anweisung kennen
grundsaetzlich gilt
bei joins sieht das so aus
joinst du zwei tabellen werden aus den beide tabellen das kreuzprodukt gemacht
(jede zeile der tabelle1 wird zusammengehaengt mit jeder zeile der tabelle2)
was natuerlich bei grossen datenmengen kombiniert mit vielen joins nicht sehr gut istmeistens kann man an joins nicht so viel machen
optimieren kann man meistens das DBMS - aber das haengt natuerlich vom DBS abalso access ist natuerlich nur schwer tunebar
gib doch mal dein select statement an dann schau ich es mir an
-
Ok:
Select * From PERSON_IDCARD R Join IDCARD I On R.IDCARD_ID = I.IDCARD_ID Join PERSON P On P.PERSON_ID = R.PERSON_ID Join Access A On A.IDCARD_ID = I.IDCARD_ID Join ENBS E On A.ENBS_ID = E.ENBS_ID Left Outer Join CYCLE C On A.CYCLE_ID = C.CYCLE_ID Order PERSON_NNAME, PERSON_VNAME
Thnx im voraus!
-
schaut nicht so schlecht aus
kannst du mir mal beschreiben wie dein system aussieht?
wieviele datensaetze pro tabelle, wieviele spalten per tabelle usw
welches Datenbanksystemich wuerd das erstens mal versuchen alle JOIN statements in klammern zu fassen
wenn du (a join b on a.anr=b.anr) join c on c.bnr=b.bnr hast
sollte er es immer gleich aufloesen
doch wie die abarbeitung des joins geschieht ist nicht immer nach der ANSI SQL recommendation gemacht
deswegen kann man manchmal optimieren
-
Naja, dass sind schon so 20 Tabellen und die größte Tabelle hat so 120000 Datensätze. Sag mal, wenn die Datenbank immer dicker wird, verlangsamt das den Traffic?
-
natuerlich
im entsprechenden wenn du eine join operation machst
wo ja zuerst das kreuzprodukt gebildet wird
das ganze ist exponential
was sich bei 1000 datensaetzen noch nicht auswirkt wirkt sich bei 10000 extrem aus
kommt auch immer auf die engine anbei deiner datenbank scheint schon richtiges datenbank tuning gefragt zu sein
das ja auf db-administrator ebene geschieht
welches DB system benutzt du??
-
Eine vernünftige Datenbank optimiert das Statement selbst, so das sie zum Ermitteln der Daten möglichst wenige Datensätze anschauen muss. Nennt sich dann Zugriffsplan und kann man sich normalerweise auch anschauen, so dass man sieht, wo die meiste Zeit drauf geht (explain).
Was du da noch machen kannst ist, Indizies auf die Primär- und Fremdschlüssel zu setzen. Dann sind 120000 Datensätze für die Datenbank kein Problem.
Der Rest ist, wie gomberl schon geschrieben hat, Datenbankabhängig. z.B. die Tabellen, die nur kleine Anzahlen von Datensätzen haben in einen eigenen Tablespace stellen, der stets komplett im Speicher steht.
-
genau wie frenki sagt haengt es immer von der datenbank ab