AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Firebird wird beim Append von Datensätze immer langsamer
Thema durchsuchen
Ansicht
Themen-Optionen

Firebird wird beim Append von Datensätze immer langsamer

Ein Thema von Chemiker · begonnen am 24. Jan 2009 · letzter Beitrag vom 31. Jan 2009
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.859 Beiträge
 
Delphi 11 Alexandria
 
#1

Firebird wird beim Append von Datensätze immer langsamer

  Alt 24. Jan 2009, 23:17
Datenbank: Firebird • Version: 2.0 • Zugriff über: FibPlus
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
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.201 Beiträge
 
Delphi 10.4 Sydney
 
#2

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

  Alt 24. Jan 2009, 23:25
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#3

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

  Alt 24. Jan 2009, 23:27
Nicht ständig neue Transaktionen anstossem bzw. diese auch abschliessen ( nicht nur bei Fehlern)
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.859 Beiträge
 
Delphi 11 Alexandria
 
#4

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

  Alt 24. Jan 2009, 23:46
Hallo Bernhard Geyer,

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 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 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 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 'NOWNOT 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
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.859 Beiträge
 
Delphi 11 Alexandria
 
#5

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

  Alt 24. Jan 2009, 23:49
Hallo mkinzler,

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
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#6

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

  Alt 24. Jan 2009, 23:49
Gibts bei FibPlus kein "Commit" oder wie läuft das da mit dem Abschluß der Transaktion...

sowas wie Form3.pFIBTransaction2.Commit ...

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;
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.859 Beiträge
 
Delphi 11 Alexandria
 
#7

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

  Alt 24. Jan 2009, 23:53
Hallo Andreas,

ja gibt es. Werde es mal ausprobieren.


Bis bald Chemiker
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#8

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

  Alt 25. Jan 2009, 00:00
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...
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.859 Beiträge
 
Delphi 11 Alexandria
 
#9

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

  Alt 25. Jan 2009, 09:20
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
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#10

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

  Alt 25. Jan 2009, 09:33
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 ?

  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:05 Uhr.
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