Entwickler-Ecke
Datenbanken - Absolute Database super langsam???
Timbo - So 04.06.06 20:26
Titel: Absolute Database super langsam???
Hallo,
habe heute, aufgrund der bekannten Probleme mit Paradox/BDE, den ganzen Tag damit verbracht, mein Programm auf Absolute Database umzustellen.
War richtig begeistert, funzt super, aber die Geschwindigkeit oh oh.
SQL-Anweisung
1: 2:
| SELECT T1.Name, T2.WG_Name, T3.VK, T4.Firma FROM T1 INNER JOIN T2 ON (T1.ID=T2.ID) INNER JOIN T3 ON (T1.ID=T3.ID) INNER JOIN T4 ON (T1.ID=T4.ID) |
T1: 15.000 Zeilen
T2: 100
T3: 15.000
T4: 300
Dauert bei BDE ca 3 sek und bei Absolute Database 26 sek !!!!!
Das kann doch nicht war sein.
Versteh das nicht, was ist da los?
Soll doch viel besser und schneller sein...
jasocul - So 04.06.06 20:32
Hast du passende Indexe angelegt?
Timbo - So 04.06.06 21:25
Jo, indexe sind drauf, macht aber fast keinen Unterschied...
Hab das ganze jetzt mal auf meinem MySqlServer getestet: 37 sek
Kann das angehen?
matze - Mo 05.06.06 18:21
kannst du evtl mal das .abs file hier anhängen, damit wir auch die Daten haben, um das nachzuvollziehen ?
WePo - Mo 05.06.06 19:18
Hi, wenn dein code so vollständig ist, falls nicht ?
Habe unter ABs mal fast deinen code genommen
t1=9000 DS, t2=500 DS, t3=24000 DS.
(also ohne dein join t4)
Dauer 16 sec. Gibt 350.000 DS zurück
Änderung auf Angabe der ID mit where id=xxxxx
Dauer 0,2sec, ergibt 1080 DS.
Schau doch mal nach der Anzahl der DS, Wolltest du das wirklich so haben?
Werner
Timbo - Di 06.06.06 00:17
Hab den knackpunkt gefunden, das WHERE GEFUEHRT=0 bringt Absolute Database so aus dem tritt,
ohne braucht es 7sek (mit 26 sek)
hier das komplette statement:
SQL-Anweisung
1: 2: 3: 4:
| SELECT BEZ, GROESSE, VK_NORM, VK_AKT, L.KURZ_NAME, WG.WARENGRP, H.KURZ_NAME, PFAND, EAN, AXL.VP, AXL.EK, RABATT_STR, EAN, MWST_ID, AU.ID, SONDER_BEZ, PLU, GEAENDERT, P_STK_KG, LIEFER, HERST, EAN_ZUS, WARENGRP.ID WARENGRP_ID, GEFUEHRT FROM ART_USER AU, FIRMA L, FIRMA H, ART_X_LIEFER AXL, WARENGRP WG WHERE GEFUEHRT = 0 AND (AU.LIEFER=L.ID) AND (AU.HERST=H.ID) AND (AU.LIEFER=AXL.LIEFER_ID) AND (AU.ID=AXL.ART_ID) AND (AU.W_GRP=WG.ID) ORDER BY BEZ |
Ergebnis sollten 15060 Zeilen sein.
anbei die datenbank als BDE und Abs Data sowie ein testprojekt...
Timbo - Di 06.06.06 00:44
Hab mich jetzt auch durch Firebird gewüllt, von den Funktionen, perfekt, hat alles was man braucht...
aber braucht für die Abfrage 451 sek
zum vergleich nochmal:
Absolute Database 26 sek, MYSQL 37 sek und BDE tatsächlich nicht mal 4 sek
WePo - Di 06.06.06 00:57
Könntest du deinen sql-code mal erneut posten.
Steig mit den Feldern nicht durch.
BSP:and(au_w_grp= wg.Id)
Teste gerade mal.
Mir ist aber schon aufgefallen, daß du keine Indices gesetzt hast.
Auf jeden Fall werden im DB-Manager, Seite Export SQL
keine angezeigt.
Werner
Timbo - Di 06.06.06 01:28
die namesgebung ist nicht so toll, ist ja auch für mich nur zum testen...
das obige sql-statement zeigt mir alle nicht geführten artikel aus der datenbank.
nicht au_w_grp sondern AU.W_GRP:
ist nur die verknüpfung zwischen der waregruppen tabelle und der Artikel tabelle...
stimmt index hatte ich in der version vergessen, macht aber auch keinen unterschied, habs gerade nochmal getestet.
man kann sowieso nur auf ART_USER einen index legen, da ART_X_LIEFER keine indizierbare spalte hat.
die beziehung zwischen ART_USER und ART_X_LIEFET ist 1:n
heißt: es gibt zu einem artikel mehrere lieferranten. alle daten die vom lieferranten abhängen stehen in ART_X_LIEFER.
vielen dank schon mal Werner...
WePo - Di 06.06.06 06:24
Also Timbo,
hier ein bißchen Code
SQL-Anweisung
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| SELECT BEZ, GROESSE, VK_NORM, VK_AKT, LIEFER, l.KURZ_NAME as liefrant, w_grp, WG.WARENGRP, HERST, h.KURZ_NAME, PFAND, EAN, AXL.VP, AXL.EK,axl.RABATT_STR, EAN,-- brauchst du das zweimal MWST_ID,ID, SONDER_BEZ, PLU, GEAENDERT, P_STK_KG, EAN_ZUS, --WARENGRP.ID WARENGRP_ID GEFUEHRT FROM ART_USER AU left join firma l on (l.id=au.liefer) left join WARENGRP WG on(AU.W_GRP=WG.ID) right join firma h on (h.id=au.herst) join ART_X_LIEFER AXL on (AU.ID=AXL.ART_ID) where GEFUEHRT=0 ORDER BY BEZ |
Nun knapp 7 sec.
Indices wären trotzdem wohl nützlich.
Habe diese gesetzt:
firma: ID
art_x_liefer:art_id
art_user: ID // damit ist dein order by 'geb' schon sortiert ,dieser Index
brachte ne gute halbe sec zusätzlich
Werner
Timbo - Di 06.06.06 10:37
Vielen Dank,
AND AU.LIEFER=AXL.LIEFER_ID
fehlt noch, sonst tauchen Arttikel mehrfach auf...
sieht man am besten wenn man GEFUEHRT=1 macht.
wie hast Du denn den index auf ART_ID bei ART_X_LIEFER gesetzt?
da sind doch einträge doppelt vorhanden???
was meinst du mit order by 'geb' was ist geb?
WePo - Di 06.06.06 13:38
Timbo
1. Mein Fehler. NICHT 'order by geb'? sondern natürlich dein 'order by bez'.
2. Index setzen. Wieso nicht? Oder besser na klar doch.
Ein Index ist doch nur dafür da der Datenbank eine innere Struktur zu verleihen, sodaß bei Suchvorgängen auf quasi "vorstrukturierte Daten" zugegriffen werden kann. Bestes Beispiel hierfür ist ein Feld 'Datum'. Mit -von..bis- wird doch häufig gesucht. Also Index drauf. Beschleunigt Suchen enorm. Mehrere DS mit gleichem Wert sind kein Problem.
Ich glaube du verwechselst hier die Indices primary & unique mit einem einfachen Index.
Noch wichtiger wird dies bei joins. Also zumindest bei häufig genutzten Abfragen solltest du schauen ob die per 'on (T1.Feld1=T2.Feld2)' verbundenen Felder indiziert sind.
(hint: Schlüssel[feld]). OK nicht übertreiben.
Tips für ABS:
a.In ABS mußt du einen Index explizit setzen. Also entweder im DB-Manager Table/restructure table/ Indexes oder per sql 'create index'.
! autoinc-Werte sind NICHT automatisch indiziert!, sollten aber wohl schon sein.
b. Wenn du ABS gekauft hast nutze deren mail-Service. M.E. ist der Spitze. Schnell UND kompetent.
c. Ich setze ABS selbst ein und bin sehr zufrieden.
Werner
Timbo - Di 06.06.06 14:26
na supa, jetzt hab ich es auch hinbekommen mit dem index, man muss da nicht "Primär", nicht "Unique", sonder "" auswählen...
hatte mich auch schon gewunder, hatte das mit dem index auch so in erinnerung
vielen dank...
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!