Autor Beitrag
Bubi
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Mi 12.06.02 22:46 
Hallo,
ich hatte schon im "alten" Delphi-Forum diese Frage gestellt, hatte aber nicht mehr die Möglichkeit eure Antworten zu lesen (schade).
Ich habe ein kleines Programm geschrieben, welches eine vorhandene DBase-Datenbank mit ca. 300.000 Einträgen (35MB) durchsuchen soll und entsprechend der eingestellten Kriterien die Ergebnisse darstellen soll.
So weit so gut, das Programm macht auch genau das, was ich erwartet habe, aber die Abfrage dauerst ca. 90 Sekunden, was jenseits von Gut und Böse ist.
Meine Vermutung an dieser Stelle ist, dass mein Programm die DBase-Datenbank Zeile für Zeile öffnet und einen vorhandenen Index (*.mdx bzw. *. ndx) komplett ausser Acht lässt.
Meine Frage ist nun, wie kann ich meinem Programm beibiegen, dass es den vorhandenen Index (natürlich in Verbindung mit einer SQL-Abfrage) verwendet?
Bitte antwortet mit einem kleinen "leicht" verständlichen Beispiel, da ich nur sehr wenig Programmier-Erfahrung habe und aus Beispielen am besten lernen kann.

Danke im Voraus. :)

Bubi
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Do 13.06.02 09:01 
Hallo!

Kenne mich nur mit Interbase aus, aber naja...

Was für eine Einschränkung der Datenmenge nimmst du denn vor ("where ...")? Wenn du z.B. dort drinnen Dinge wie like "%meinsuchstr%", muss (nach meiner Kenntnis) jede Datenbank alle Zeilen danach abgrasen, Indizes nützen bei solchen Abfragen nix.

Poste doch mal das Statement!

Cu, :wink:
Udontknow
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Do 13.06.02 09:43 
Hi,

auch ich habe mich gefrustet von Paradox getrennt. Aber ich schätze diese optimierungsmöglichkeit ist recht universal:

Wenn du mehrere bedingungen in der WHERE klausel hast, solltest du diese nach ausschluspotential sortieren. Also die bedingungen zuerst stellen, die deine ergebnismenge schnell verkleinern.

ausblenden Quelltext
1:
2:
3:
SELECT * 
FROM Personen
WHERE Name=Meier AND Geschlecht=m

sollte schneller abgearbeitet werden als
ausblenden Quelltext
1:
2:
3:
SELECT * 
FROM Personen
WHERE Geschlecht=m AND Name=Meier


Weil es vermutlich weniger Meiers gibt als Männer.

Meines wissens wird übrigens jeder Index automatisch verwendet wenn dein Query die Indexierten Felder verwendet.

Gruß
Klabautermann
Bubi Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Sa 15.06.02 10:55 
Hallo Udontknow,
eine Abfrage mit LIKE %IRGENDWAS% macghe ich nicht, aber vieleicht kannst du mir ja trotzdem weiterhelfen, wenn du meine Abfrage siehst. :D
ausblenden Quelltext
1:
2:
3:
4:
 Query1.DatabaseName := Pfad;
 Query1.SQL.Clear;
 Query1.SQL.Add('SELECT Barcode, Datum, Zeit, Testnr, Platz, F_text, Mwert, Einheit, Utol, Otol FROM Rep1.dbf WHERE Barcode = "' + ComboBox1.Text + '" ORDER BY Datum, Zeit;');
 Query1.Open;
Könnte man z.B. als erstes die entsprechenden Daten aus der Datenbank holen und erst in einem zweiten Schritt nach dem Datum und der Uhrzeit sortieren? :?:
Aber dabei stellt sich mir die Frage, auf welche Daten beziehe ich dann meine erneute Abfrage?

Eine andere Idee, die hatte, war die Abfrage nicht einem Query-Element, sondern mit einem TTable-Element zu machen, aber dabei bekommen ich doch sicher nur einen Datensatz als Ergebnis zurück oder? Wie kann ich eine Abfrage mit einem TTable-Element machen, das mir mehrere Datensatze als Antwort gibt. (Dann wüsste ich auch, wie man einen Index mit ins Programm einbezieht).

Ich hoffe du kannst mir weiterhelfen. :P :shock: :P

Code-Tags hinzugefügt. Tino
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Mo 17.06.02 08:45 
Tja... Also:

Wieviele Datensätze kriegst du denn geliefert? Wenn du die Hälfte von den 50.000 DS zurückbekommst, dauert es tatsächlich... :wink:

Ist das Feld "Barcode" indiziert? Wenn nein, Index erstellen!
Sind die Felder "Datum" und "Zeit" indiziert? Wenn nein, Index erstellen!

Am besten postest du mal die Indizes auf dieser Tabelle. Wenn du einen Index über mehrere Felder hast, kann es Probleme geben.

Cu,
Udontknow
Alfons-G
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 307

Win XP Prof, Linux, Win 7
D5 Prof, D7 Architect, D2005 Architect, D2007 Architect
BeitragVerfasst: Mo 17.06.02 23:05 
Daten holen und in einem zweiten Schritt weiterverarbeiten geht mittels verschachtelter Abfragen. Das sieht dann so aus:
ausblenden Quelltext
1:
2:
3:
4:
5:
select a, b, c ,d from
(select a, b, c, d from
Tabelle
where c = 'xyz')
order by a, b
Allerdings bringt das in diesem Fall keinen Vorteil. Optimierungen sind stark datenbankabhängig und Paradox habe ich aus mehreren Gründen für grössere Datenbestände niemals verwendet. Allerdings müsste Paradox einen vorhandenen Index für eine Abfrage benutzen, wenn er auf den richtigen Feldern ist.

:)

_________________
Alfons Grünewald
Cashels
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 167



BeitragVerfasst: Mi 26.06.02 10:14 
Hi Bubi,

DBase ist ungefähr so alt wie MS-DOS :lol: Ist also nicht für solche Datenmengen ausgelegt.

Du solltest wenn möglich auf ein anderes Datenbanksystem umsteigen. Da gibts relativ gravierdende Unterschiede... Hängt in erster Linie von deinem Geldbeutel ab. Für MSSQL ist die Menge z.B. ein Klax, dafür rappst du aber mal locker 2000 € auf den Tisch.

Gruss,
Tom
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Mi 26.06.02 10:58 
Also wir in unserer Firma schwören ja auf Interbase, (FLAME) nicht auf dieses Ketzerwerk MS-SQL (/FLAME) :wink: ... Das ist nämlich umsonst und hat viele interessante Features...
Cashels
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 167



BeitragVerfasst: Mi 26.06.02 11:17 
Ich arbeit auch viel mit Interbase, und bin auch ganz zufrieden damit... Dennoch ist MSSQL in einigen Punkten wesentlich schneller. Interbase wird das angesprochener Problem mit Sicherheit aber auch bestens meistern können.

Gruss,
Tom