Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi TIBDataSet - Performance (https://www.delphipraxis.net/97299-tibdataset-performance.html)

Nico80 8. Aug 2007 09:28

Datenbank: Interbase • Version: 7.1 • Zugriff über: IBX

TIBDataSet - Performance
 
Hallo an alle IBX-Experten,

habe eine Verständnisfrage.

Ich habe ein DataSet, um DS in die Datenbank einzufügen, zu aktualisieren und zu löschen.

Folgendes:

Delphi-Quellcode:
DataSet.SelectSQL.Text := 'SELECT...';
DataSet.InsertSQL.Text := 'INSERT...';
DataSet.UpdateSQL.Text := 'UPDATE...';
DataSet.DeleteSQL.Text := 'DELETE...';
Wenn ich jetzt 1000 DS einzeln aus der DB lese (also für jeden DS das DataSet neu öffne) kostet das paar Sekündchen.

Wenn ich nun die InsertSQL, UpdateSQL, DeleteSQL-Zuweisungen weglasse, habe ich beim Lesen der DS einen Performance-Gewinn um die Hälfte der Zeit.

Woran liegt das??

Bernhard Geyer 8. Aug 2007 09:35

Re: TIBDataSet - Performance
 
Vermutlich werden irgendwelche Parsingoperationen/Parameteraufbau im Hintergrund durchgeführt.

Noch mehr Performance bekommst du diesen ganzen Automatismus wegläßt und prepared Statements verwendest.

hoika 8. Aug 2007 09:54

Re: TIBDataSet - Performance
 
Hallo,

das DataSet.Open ruft das SelectSQL auf.
Steht dort etwas in der Art 'Select * From Table',
wird auf dem Server die komplette Tabelle geöffnet
und "zwischengespeichert" ,
du könntest ja jetzt per while not EOF
was Lesen wollen.

Das kann je nach Grösse der Tabelle schon etwas dauern.


Heiko

Hansa 8. Aug 2007 10:32

Re: TIBDataSet - Performance
 
Sieht so aus, als ob du den Dataset-Generator nicht benützt und somit für jeden Datensatz überflüssigerweise die Insert usw. Statements extra von Hand zusammenbaust. Kein Wunder, wenn das dauert.

mkinzler 8. Aug 2007 10:52

Re: TIBDataSet - Performance
 
Es spricht imho aber nichts dagegen das manuell zu machen, bzw. die automatisch erzeugten Statements per Hand zu optimieren.

Hansa 8. Aug 2007 11:13

Re: TIBDataSet - Performance
 
dafür spricht : ?? :mrgreen:

dagegen :
  • Überlistung des Servers könnte kontraproduktiv sein
  • Syntaxfehler wahrscheinlicher
  • vergessene Felder
  • Schreibfehler
  • kein Performance-Gewinn in Sicht
  • nach einem Close muss der Kram wieder neu gemacht werden
  • usw.

Normalerweise lässt man das Dataset mit Hilfe des Dataset-Generators die grundlegenden Statements (Insert, update...) erst mal erzeugen. Dem Programm sind dann die Tabellen-Felder erst mal bekannt. Und zwar alle ! Das hindert einen aber nicht flgendes zu machen :

Delphi-Quellcode:
Dataset.Close;
Dataset.SelectSQL.Text := 'SELECT ID,NR,NAME FROM TABLE1 WHERE NR < 100; // Einschränkung der Datenmenge
Dataset.Open;
while not Dataset.EOF do begin
...Bearbeitung der Daten
  Next
end;

mkinzler 8. Aug 2007 11:18

Re: TIBDataSet - Performance
 
Hallo Hansa,
du hast dir noch nie die automatsich erzeugten Statements angesehen oder?

Hansa 8. Aug 2007 11:39

Re: TIBDataSet - Performance
 
Doch, teste es doch selber. :mrgreen:

mkinzler 8. Aug 2007 11:44

Re: TIBDataSet - Performance
 
also wenn Tabellen einen Primärschlüssel haben braucht man nicht
delete from
SQL-Code:
<Tabelle<>where <Feld1>= ..., <Feld2>= ... ;
schreiben, da
SQL-Code:
delete from <Tabelle< where <pk> = ...;
reicht usw.

Hansa 8. Aug 2007 11:55

Re: TIBDataSet - Performance
 
Einfacher gehts mit :

Delphi-Quellcode:
Dataset.Delete;
Sofern der SQL-Generator so was in der Art erzeugt hat :

SQL-Code:
DELETE FROM
    ART
WHERE
        ID = :OLD_ID
Wer will, schreibt so was eben von Hand in seinen Source und nimmt damit dem Dataset die Arbeit ab. :zwinker:


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:09 Uhr.
Seite 1 von 4  1 23     Letzte »    

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