![]() |
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:
Wenn ich jetzt 1000 DS einzeln aus der DB lese (also für jeden DS das DataSet neu öffne) kostet das paar Sekündchen.
DataSet.SelectSQL.Text := 'SELECT...';
DataSet.InsertSQL.Text := 'INSERT...'; DataSet.UpdateSQL.Text := 'UPDATE...'; DataSet.DeleteSQL.Text := 'DELETE...'; 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?? |
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. |
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 |
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.
|
Re: TIBDataSet - Performance
Es spricht imho aber nichts dagegen das manuell zu machen, bzw. die automatisch erzeugten Statements per Hand zu optimieren.
|
Re: TIBDataSet - Performance
dafür spricht : ?? :mrgreen:
dagegen :
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; |
Re: TIBDataSet - Performance
Hallo Hansa,
du hast dir noch nie die automatsich erzeugten Statements angesehen oder? |
Re: TIBDataSet - Performance
Doch, teste es doch selber. :mrgreen:
|
Re: TIBDataSet - Performance
also wenn Tabellen einen Primärschlüssel haben braucht man nicht
delete from
SQL-Code:
schreiben, da
<Tabelle<>where <Feld1>= ..., <Feld2>= ... ;
SQL-Code:
reicht usw.
delete from <Tabelle< where <pk> = ...;
|
Re: TIBDataSet - Performance
Einfacher gehts mit :
Delphi-Quellcode:
Sofern der SQL-Generator so was in der Art erzeugt hat :
Dataset.Delete;
SQL-Code:
Wer will, schreibt so was eben von Hand in seinen Source und nimmt damit dem Dataset die Arbeit ab. :zwinker:
DELETE FROM
ART WHERE ID = :OLD_ID |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:18 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz