Autor Beitrag
Bomania
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 139

Win XP

BeitragVerfasst: Mo 09.06.03 19:10 
Hallo,

ich kenne mich mit ADO unter Delphi noch nicht so aus und ich habe ein kleines Performance-Problem mit meinem Query. Wie ihr unten sehen könnt, weiß ich mir momentan nicht anders zu helfen. Provider ist Jet 4.0. Der folgende Teil braucht irgendwie ziemlich lang. Ich schätze mal das liegt daran, dass bei jedem Schleifendurchgang das Query-SQL neu erstellt wird.
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
...
while  Integer(loop) <> 0 do  //Schleife wird ca. 30 mal durchlaufen
begin
  ado_Query.SQL.Add('SELECT Type,File FROM Data WHERE ....');
  ado_Query.Open;
  if ado_Query.FieldByName('Type').AsInteger = 0 then  //Tabelle hat momentan nur 3 Einträge
  begin
    ...
  end
  ado_query.SQL.Clear;
end;
ado_Query.Close;

Geht das auch irgendwie anders? Bei jedem Schleifendurchgang soll nach einem anderen Wert in der betreffenden Tabelle der Datenbank gesucht werden. Momentan wird wie gesagt bei jedem Schleifendurchgang der Query neu erstellt bzw ausgeführt und das dauert irgendwie ungewohnt lange. Kann mir da jemand weiterhelfen? Es handelt sich hier ja um ein alltägliches Problem, ich weiß nur noch nicht, wie ich das in den Griff kriege.

Danke und Gruß,
Björn
Tweafis
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 647

WinXP + fbsd
Delphi 5 Prof
BeitragVerfasst: Mo 09.06.03 19:37 
Tip, weiß nicht wie man es realisiert bzw. macht:

Mach einmal die Query
ausblenden Quelltext
1:
SELECT Type,File FROM Data					


und durchsuch dann das Array (oder Objekt oder was auch immer), das sich ergibt mit Delphi eigenene Funktionen oder sowas.

_________________
.: Es wird der Tag kommen, an dem wir es nicht mehr ändern können :.
Bomania Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 139

Win XP

BeitragVerfasst: Mo 09.06.03 19:48 
Ja, an soetwas hatte ich auch schon gedacht. Leider weiß ich selbst auch nicht, wie sich sowas realisieren lässt :?
thePraYeR
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 27



BeitragVerfasst: Mi 11.06.03 09:55 
Hier gibt es nur 2 Möglichkeiten (die vernünftig sind ==> bitte nix á wir kopieren alles in ein Objekt und durchsuchen das dann im RAM):

Indizes auf DB über die Selektionskriterien setzen.
Selektion so klein, wie möglich halten.

Was mir unplausibel erscheint:
Warum wird Data.Type auf 0 geprüft und nur dann ein Block ausgeführt? Wäre es nicht sinnvoller, dieses Kriterium in die Where-Klausel zu integrieren?
Bomania Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 139

Win XP

BeitragVerfasst: Do 12.06.03 13:24 
thePraYeR hat folgendes geschrieben:
Indizes auf DB über die Selektionskriterien setzen.
Selektion so klein, wie möglich halten.

:?:

thePraYeR hat folgendes geschrieben:
Was mir unplausibel erscheint:
Warum wird Data.Type auf 0 geprüft und nur dann ein Block ausgeführt? Wäre es nicht sinnvoller, dieses Kriterium in die Where-Klausel zu integrieren?

Weil ich den Wert überprüfen will ob da Null drinn steht. Und nur dann soll was passieren. Also brauch ich in dem Fall ja auch kein Else.
thePraYeR
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 27



BeitragVerfasst: Do 12.06.03 14:59 
Warum selektierst Du nich Type auf 0. Würde mir sinnvoll erscheinen, da in Deinem Codeauszug der If-Block weder vor- noch nachgelagerten code hat.

Wenn Du einzig die Tupel behandeln willst, bei denen Type 0 ist, dann kannst Du Dir durch Veränderung der Selektionskriterien die Bewegungen über die anderen Tupel sparen. Sollte deutlichen Geschwindigkeitsvorteil bringen.