Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Geschwindigkeitsoptimierung. (https://www.delphipraxis.net/22328-geschwindigkeitsoptimierung.html)

mojo777 16. Mai 2004 00:16


Geschwindigkeitsoptimierung.
 
Hallo,

ich stehe heute vor einem ernst zu nehmenden problem mit der Geschwindigkeit meiner Anwendung.
UNd zwar geht es um Datenbankabfragen.
Ich habe eine Tabelle mit recht vielen daten (also 1000-5000). Und die tabelle soll jetzt nach einem wert durchsucht werden. Dies soll möglichst schnell gehen. Ich kenne da schon 3 möglichkeiten. und bei 2 bin ich mir mit der geschwindigkeit nicht sicher... beide laufen irgendwie gleich langsam, obwohl ich von unterscheidlichen quellen gehört habe, dass es eigentlich schneller klappen sollte. ok. zu den fällen:

1.
Delphi-Quellcode:
for i:=1 to dmData.ibTable.RecordCount do
begin
bonsai;
dmData.ibTable.NExt; //geht also alle datensätze durch, bis der gesuchte wert gefunden wurde....
end;
2.
Delphi-Quellcode:
dmData.ibTable.Locate('ARTNR', ed_artnr.Text, [loCaseinsensitive]);
3.
SQL-Code:
SELECT * FROM table WHERE ARTNR='+ed_arntnr.Text
wie ihr seht, kann man die 1. methode gleich vergessen.

wie bastle ich diese funktion am schnellsten? bei mir ist es so, dass man ca 0,5 sekungen warten muss bis ein wert von 3000 anderen gefunden wurde... das ist sehr lahm...!!!!

wäre sehr dankbar für anregungen... :-)

Minz 16. Mai 2004 00:40

Re: Geschwindigkeitsoptimierung.
 
Hi,

wenn du z.B. nach der Artikelnummer suchst solltest du deine Tabellen so aufbauen, dass die Artikelnummern einmalig und indiziert sind.

Dann sollte ein Zugriff auch mittels locate ok sein.

kiar 16. Mai 2004 00:42

Re: Geschwindigkeitsoptimierung.
 
hallo mo...,

hast du die tablle indiziert?

mojo777 16. Mai 2004 11:25

Re: Geschwindigkeitsoptimierung.
 
jetzt hab ich sie indiziert.... :oops:

ist jetzt etwas schneller... ist aber immer noch nicht sooo doll... naja... der code ist auch etwas komplizierter.. ich werd mal gucken wo ich noch indizierung vergessen hab.

wie kann ich die bearbeitungsdauer feststellen?
dass ich z.b. nach einem click angezeigt bekomme, wie lange die operation gebraucht hat.

DP-Maintenance 16. Mai 2004 11:38

DP-Maintenance
 
Dieses Thema wurde von "Luckie" von "VCL-Komponenten und Controls" nach "Datenbanken" verschoben.
Du sagst selbst, dass es eine Datenbankfrage sei... :roll:

mirage228 16. Mai 2004 11:43

Re: Geschwindigkeitsoptimierung.
 
Zitat:

Zitat von mojo777
jetzt hab ich sie indiziert.... :oops:

ist jetzt etwas schneller... ist aber immer noch nicht sooo doll... naja... der code ist auch etwas komplizierter.. ich werd mal gucken wo ich noch indizierung vergessen hab.

wie kann ich die bearbeitungsdauer feststellen?
dass ich z.b. nach einem click angezeigt bekomme, wie lange die operation gebraucht hat.

Hi,

Hier im Forum suchenGetTickCount sollte da behilflich sein.

Delphi-Quellcode:
var
  A, B: Cardinal;
begin
  A := GetTickCount;
  // tue etwas
  B := GetTickCount - A;
  ShowMessage(IntToStr(B));
end;
mfG
mirage228

mojo777 16. Mai 2004 11:49

Re: Geschwindigkeitsoptimierung.
 
yeah danke mahn! :bounce2:

mojo777 16. Mai 2004 11:54

Re: Geschwindigkeitsoptimierung.
 
noch eine frage zur indizierung..... wie mach ich das???????
immer wenn ich die felder unter IndexDefs eingebe, verschwinden sie wieder gleich...
muss ich es etwa über interbase machen?

danke.

Robert_G 16. Mai 2004 11:55

Re: Geschwindigkeitsoptimierung.
 
Moin :hi:
SQL-Code:
SELECT * FROM table WHERE ARTNR='+ed_arntnr.Text
Das tut weh! ;)

Du änderst jedesmal den Wortlaut des Statements, der Server kann es deshalb nicht mehr zu einem früheren Aufruf zuordnen.
Er muss also den Code neu parsen, die Berechtigungen prüfen, einen Query Plan erstellen, die Werte holen.

Machst du es so wie im Schnipsel unten wirst du etwas feststellen:
  • Die Abfrage läuft beim ersten Mal nur minimal schneller als dein Schnipsel, aber beim 2. Aufrufen braucht sie massiv weniger Zeit (abhängig von der verwendeten DB und ihrem Cache-Verfahren)
  • und das gilt für alle Anmeldungen, die diese Abfrage ausführen (bei einem anderen User werden nur einmal die Berechtigungen geprüft)

Delphi-Quellcode:
With ADOQuery Do
Begin
  SQL.Text :=
    'SELECT *' + #10 +
    'FROM  Table' + #10 +
    'WHERE ARTNR = :i_Ed_ArntNr';
  // Parsen des Statements um Query Parameter zu finden...
  Prepared := True;
  // Werte an Query Parameter übergeben...
  Parameters.ParamByName('i_Ed_ArntNr').Value := Ed_ArntNr.Text;
  Open;
  // Laufe durch die Ergebnisse bis zum letzten Eintrag (Eof)...
  While not Eof Do
  Begin
    //Was immer du hier machen willst...
    //mit "Next" springst du zum nächsten Eintrag...
    Next;
  End;
  //...
End;

mojo777 16. Mai 2004 11:57

Re: Geschwindigkeitsoptimierung.
 
bestätigung.... das geht über interbase... :lol:
die dauer beträgt aber dennoch ca 800 ms...... (p4 2,8ghz!)
das ist gar nicht guttah!


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:13 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz