Moin Delphianer,
ich hätte da mal einige Verständnisfragen.
Ich greife über ADS auf Clipper-dBase-Dateien zu. In meinem Fall eine adress.dbf, in der ca. 50.000 Adressen bespeichert sind. Zu dieser adress.dbf existiert eine Indexdatei adress.cdx!
Nun öffne ich die adress.dbf mit dem
SQL-Befehl
SELECT * FROM adress
und zeige das Ergebnis in einem DBGrid an. Das Ergebnis ist in 0,nix da.
Als nächtes frage ich mit
SELECT * FROM adress WHERE name <'S%'
an. Das Ergebnis läst allerdings ca. 10 sec auf sich warten.
Über
AdsQuery.IndexDefs.Items[i].FieldExpression
habe ich festgestellt, dass unter anderem auch ein Index über 'name' existiert. Das zeigt doch auch, das die Indices geladen werden.
Nun sollte man doch meinen, dass die Anfrage über die Where-Clausel mindestens genauso schnell ist als ohne, jedenfalls keine 10 sec dauert?
Werden die Indices überhaupt benutzt? Kann man überprüfen ob die Indices auch wirklich greifen?
Meine Erfahrungen mit anderen DBs haben mich gelehrt, dass (in den meisten Fällen); je mehr man das Result mittels WHERE-Clauseln einschränkt, desto schnell kommt das Ergebnis zurück.
Das stimmt doch? (für die meisten Fälle)
Ähnliche Sorgen habe ich auch mit AdsQuery.Locate.
Frage ich die
DB mit ersterem
SQL-Befehl an und möchte nur zu einem Namen springen der z.b. mit 'W' beginnt, dauert es wieder ca. 10 sec bis der Datensatz gefunden wurde.
Werden auch beim Locate die Indices benutz? Wieso dauert das so lange?
Was macht das Locate genau? Durchsucht es den Speicher oder die
DB?
Selbst wenn ich vor dem Locate-Aufruf den AdsQuery.IndexNamen auf meinen Index über 'Name' lege, ändert sich nichts an der Performance.
Das das Anzeigen von 50.000 Adressen in einem Fenster nicht grade sinnvoll ist weiß ich selbst, allerdings ist mein Chef davon nicht weg zubekommen.
Bin ich hoffnungslos verloren oder gibt es doch noch Möglichkeiten um die Sache zu beschleunigen?
Gruß
gmc
[edit=r_kerber]Einige Delphi- durch SQL-Tags ersetzt. Mfg, r_kerber[/edit]