Autor Beitrag
Timbo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 166



BeitragVerfasst: So 04.06.06 20:26 
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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: So 04.06.06 20:32 
Hast du passende Indexe angelegt?
Timbo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 166



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 4613
Erhaltene Danke: 24

XP home, prof
Delphi 2009 Prof,
BeitragVerfasst: 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 ?

_________________
In the beginning was the word.
And the word was content-type: text/plain.
WePo
Hält's aus hier
Beiträge: 6

Win XP pro
Delphi 6 prof
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 166



BeitragVerfasst: 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:
ausblenden 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...
Einloggen, um Attachments anzusehen!


Zuletzt bearbeitet von Timbo am Di 06.06.06 01:44, insgesamt 1-mal bearbeitet
Timbo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 166



BeitragVerfasst: 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


Zuletzt bearbeitet von Timbo am Di 06.06.06 01:41, insgesamt 1-mal bearbeitet
WePo
Hält's aus hier
Beiträge: 6

Win XP pro
Delphi 6 prof
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 166



BeitragVerfasst: 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
Hält's aus hier
Beiträge: 6

Win XP pro
Delphi 6 prof
BeitragVerfasst: Di 06.06.06 06:24 
Also Timbo,
hier ein bißchen Code
ausblenden 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  /* verstehe dieses Feld nicht */
GEFUEHRT  /* zum prüfen ok, sonst überflüssig */
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 166



BeitragVerfasst: 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
Hält's aus hier
Beiträge: 6

Win XP pro
Delphi 6 prof
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 166



BeitragVerfasst: 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...