Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Firebird wird beim Append von Datensätze immer langsamer (https://www.delphipraxis.net/128131-firebird-wird-beim-append-von-datensaetze-immer-langsamer.html)

Chemiker 24. Jan 2009 22:17

Datenbank: Firebird • Version: 2.0 • Zugriff über: FibPlus

Firebird wird beim Append von Datensätze immer langsamer
 
Hallo,

zum Testen meiner Anwendung generiere ich Testdaten und schreibe sie in eine Firebird-Datenbank.
Am Anfang ist das Anfügen der Datensätze auch noch recht schnell gegangen, aber Mitlehrweise ist es doch sehr zähflüssig.

Delphi-Quellcode:
procedure dbEinfuegen;
var
  strText: String;
  dbZahl: Double;
  strSende: String;
  z: Integer;
begin
  For z:=0 to high (Form3.MAArr) do
  begin
    strSende:= ZufallMSmitWert(Form3.MAArr[z].FMAID,
                             Form3.MAArr[z].FMWMinBereich,
                             Form3.MAArr[z].FMWMaxBereich);

    StrText:= copy (strSende,2,5); // Nur die ersten 5 Zeichen übernehmen.StrSende[1,3];
    dbZahl:= strToFloat(copy(strSende,7,Length(strSende)-7));

    if pos('M1',StrText)=0 then
    begin
      Form3.pFIBTransaction2.StartTransaction;
      try
        Form3.PFIBDataSet2.Append;
        Form3.PFIBDataSet2['MW_MSID']:= strText;
        Form3.PFIBDataSet2['MW_MW']:= dbZahl;
        Form3.pFIBDataSet2['MW_DATUMUHRZEIT']:= Form3.DTDatumUhrZeit;
        Form3.pFIBDataSet2.Post;
      except
        Form3.pFIBTransaction2.RollbackRetaining;
      end;
      end else
      begin
      if Form3.i = 70 then
      begin
        Form3.pFIBTransaction2.StartTransaction;
        try
          Form3.PFIBDataSet2.Append;
          Form3.PFIBDataSet2['MW_MSID']:= strText;
          Form3.PFIBDataSet2['MW_MW']:= dbZahl;
          Form3.pFIBDataSet2['MW_DATUMUHRZEIT']:= Form3.DTDatumUhrZeit;
          Form3.pFIBDataSet2.Post;
          Form3.bME:= TRUE;
        except
          Form3.pFIBTransaction2.RollbackRetaining;
        end;
     end;
   end;
 end;
end;
Mit dieser Procedure werden die Datensätze angehängt.

Vielleicht hat einer von euch eine Idee, wie man das Anhängen der Datensätze beschleunigen kann.

Bis bald Chemiker

Bernhard Geyer 24. Jan 2009 22:25

Re: Firebird wird beim Append von Datensätze immer langsamer
 
Definier Zählflüssig und deine Testumgebung? Hast du auch den Virenscanner für deine Firebird-DB-Dateien ausgeschaltet? Wie schaut es mit der Tabellendefinition (Indize, ...) aus?

Und dein Quellcode ist ja schrecklich was die Kapslung betrifft. Du greifst von einer unabhängigen Funktion fest auf eine globale Variable (Forms3) zu. Wenn schon definiere als mindesten die Funktion als Methode von Form3 und lass in der Methode alle Form3-Angaben weg.

mkinzler 24. Jan 2009 22:27

Re: Firebird wird beim Append von Datensätze immer langsamer
 
Nicht ständig neue Transaktionen anstossem bzw. diese auch abschliessen ( nicht nur bei Fehlern)

Chemiker 24. Jan 2009 22:46

Re: Firebird wird beim Append von Datensätze immer langsamer
 
Hallo Bernhard Geyer,

Zitat:

Zitat von Bernhard Geyer
Und dein Quellcode ist ja schrecklich was die Kapslung betrifft. Du greifst von einer unabhängigen Funktion fest auf eine globale Variable (Forms3) zu. Wenn schon definiere als mindesten die Funktion als Methode von Form3 und lass in der Methode alle Form3-Angaben weg.

Da gebe ich Dir vollkommen Recht!!! Habe Teile der Procedure aus der Anwendung schnell zusammen kopiert.

Zitat:

Zitat von Bernhard Geyer
Definier Zählflüssig und deine Testumgebung?

Am Anfang hat das einfügen von ca. 500 Datensätze ca. 1sek, gedauert, jetzt nachdem ca. 0,5 Mio. Datensätze vorhanden sind dauert es ca. 25 sek.

Zitat:

Zitat von Bernhard Geyer
Hast du auch den Virenscanner für deine Firebird-DB-Dateien ausgeschaltet?

Nein, hat der Virenscanner denn mit zunehmenden Anzahl an Datensätze so einen großen Einfluss?

Zitat:

Zitat von Bernhard Geyer
Wie schaut es mit der Tabellendefinition (Indize, ...) aus?

SQL-Code:
ET SQL DIALECT 3;

SET NAMES NONE;

SET CLIENTLIB 'C:\Programme\Firebird\Firebird_2_0\bin\fbclient.dll';



/******************************************************************************/
/****                               Domains                               ****/
/******************************************************************************/

CREATE DOMAIN DATUMZEIT AS
TIMESTAMP;

CREATE DOMAIN MSID AS
VARCHAR(5) CHARACTER SET WIN1252
NOT NULL;

CREATE DOMAIN MSINCID AS
INTEGER
CHECK (VALUE>0);

CREATE DOMAIN MW AS
DOUBLE PRECISION;



/******************************************************************************/
/****                              Generators                             ****/
/******************************************************************************/

CREATE GENERATOR MW_ID_GEN;


/******************************************************************************/
/****                                Tables                               ****/
/******************************************************************************/



CREATE TABLE MW_TABELLE (
    MW_ID           MSINCID NOT NULL,
    MW_MSID         MSID NOT NULL,
    MW_DATUMUHRZEIT DATUMZEIT DEFAULT 'NOW' NOT NULL,
    MW_MW           MW NOT NULL
);



/******************************************************************************/
/****                             Primary Keys                            ****/
/******************************************************************************/

ALTER TABLE MW_TABELLE ADD CONSTRAINT PK_MW_TABELLE PRIMARY KEY (MW_ID);


/******************************************************************************/
/****                               Indices                               ****/
/******************************************************************************/

CREATE INDEX MW_TABELLE_DATUM ON MW_TABELLE (MW_DATUMUHRZEIT);
CREATE INDEX MW_TABELLE_MSID ON MW_TABELLE (MW_MSID);


/******************************************************************************/
/****                               Triggers                              ****/
/******************************************************************************/


SET TERM ^ ;


/******************************************************************************/
/****                         Triggers for tables                         ****/
/******************************************************************************/



/* Trigger: SET_MW_ID */
CREATE TRIGGER SET_MW_ID FOR MW_TABELLE
ACTIVE BEFORE INSERT POSITION 0
AS
begin
  if (new.mw_id is null) then
  new.mw_id = gen_id(mw_id_gen, 1);
end
^

SET TERM ; ^



/******************************************************************************/
/****                             Descriptions                            ****/
/******************************************************************************/

DESCRIBE DOMAIN DATUMZEIT
'Aktuelles Datum und Uhrzeit';

DESCRIBE DOMAIN MSID
'Messstellen ID besteht aus der 3
 Stelligen MANr und aus der 2 Stelligen
MSNr.';

DESCRIBE DOMAIN MSINCID
'CHECK (VALUE>0)';

DESCRIBE DOMAIN MW
'Gemessener Messwert';



/* Fields descriptions */

DESCRIBE FIELD MW_ID TABLE MW_TABELLE
'CHECK (VALUE>0)';

Bis bald Chemiker

Chemiker 24. Jan 2009 22:49

Re: Firebird wird beim Append von Datensätze immer langsamer
 
Hallo mkinzler,

Zitat:

Zitat von mkinzler
Nicht ständig neue Transaktionen anstossem bzw. diese auch abschliessen ( nicht nur bei Fehlern)

Und wie müsste das Aussehen?

Bis bald Chemiker

haentschman 24. Jan 2009 22:49

Re: Firebird wird beim Append von Datensätze immer langsamer
 
Gibts bei FibPlus kein "Commit" :gruebel: oder wie läuft das da mit dem Abschluß der Transaktion...

sowas wie Form3.pFIBTransaction2.Commit ... :roll:

prinzipiell:
Delphi-Quellcode:
StartTransaktion;
try
  // alles was datentechnisch zusammen ausgeführt werden muß
  Commit; // Daten werden "bestätigt" / eingetragen
except
  Rollback; // Änderungen werden zurückgenommen
end;

Chemiker 24. Jan 2009 22:53

Re: Firebird wird beim Append von Datensätze immer langsamer
 
Hallo Andreas,

ja gibt es. Werde es mal ausprobieren.


Bis bald Chemiker

haentschman 24. Jan 2009 23:00

Re: Firebird wird beim Append von Datensätze immer langsamer
 
Nachtrag:

wie schon oben erwähnt hast du ohne COMMIT mit jedem Datensatz eine offene Transaktion mehr. Das prinzipielle Beispiel kannst du so immer als Block betrachten welcher zusammengehört. Start --> Commit --> bei Fehler Rollback

hoffe geholfen zu haben... :hi:

Chemiker 25. Jan 2009 08:20

Re: Firebird wird beim Append von Datensätze immer langsamer
 
Hallo,

ich habe jetzt folgende Maßnahmen durchgeführt.

1. Die Datenbank wird vom Virenscanner nicht mehr gescannt.
2. Hinter Post ein Commit gesetzt um die Transaktionen abzuschließen.

Ich habe den PC jetzt übernacht(5h) laufen lassen, aber er hat nur ca. 180.000 Datensätze anfügt. Die Geschwindigkeit hat sich nicht signifikant erhöht.

Gibt es noch andere Stellschrauben, um die Geschwindigkeit zu erhöhen?


Bis bald Chemiker

haentschman 25. Jan 2009 08:33

Re: Firebird wird beim Append von Datensätze immer langsamer
 
Guten Morgen..

Zitat:

Ich habe den PC jetzt übernacht(5h) laufen lassen, aber er hat nur ca. 180.000 Datensätze anfügt.
...eine frische Datenbank oder die alte mit den offenen Transaktionen ?

wie wäre es, wenn du das ganze nicht mit Append/Post sondern mit SQL Insert machen würdest ?

:wink:


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:35 Uhr.
Seite 1 von 3  1 23      

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