Delphi-PRAXiS
Seite 2 von 3     12 3      

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 25. Jan 2009 08:39

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

die alte Datenbank.


Bis bald Chemiker

haentschman 25. Jan 2009 08:43

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

die alte Datenbank.
...zum einen würde ich mal mit einer neuen probieren
...zum anderen mal mit SQL Insert arbeiten (dürfte dem Append/Post überlegen sein 8) )

:P

WoGe 25. Jan 2009 08:45

Re: Firebird wird beim Append von Datensätze immer langsamer
 
Hallo
ich habe vor einiger Zeit mal ein ähnliches Problem untersucht
und habe für 1 MIO Datensätze ca 2h gebraucht.

Verwendet habe ich die IBX-Komponenten und die Werte mit einer Query ala Insert into eingetragen.
Die Datenbank war dabei jungfräulich

Grüsse
wo

haentschman 25. Jan 2009 08:51

Re: Firebird wird beim Append von Datensätze immer langsamer
 
...ich bin zwar kein FIB Experte :wink: aber deine SQL Anweisung könnte in etwa so aussehen.
Delphi-Quellcode:
Form3.PFIBQuery.SQL.Text:= 'insert into MW_TABELLE (MW_MSID,MW_MW,MW_DATUMUHRZEIT) values (:ID,:MW,:DATUM)';
Form3.PFIBQuery.ParamByName('ID'):= strText;
Form3.PFIBQuery.ParamByName('MW'):= dbZahl;
Form3.PFIBQuery.ParamByName('DATUM'):= Form3.DTDatumUhrZeit;
Form3.PFIBQuery.ExecSQL;

Chemiker 25. Jan 2009 08:58

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

@ Andreas:

Zitat:

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

Ein Versuch kann nicht schaden.

Aber mal eine andere Frage, ich lassen noch ein DBGrid mitlaufen, kann das mit zunehmender Anzahl an Datensätze die Datenbank ausbremsen?
Ich benutze es eigentlich nur, um zu sehen ob noch Datensätze angefügt werden.

Zitat:

Zitat von Andreas
...zum einen würde ich mal mit einer neuen probieren

Zum Anfang war das einfügen ja noch schnell, wird aber mit zunehmender Größe der Datenbank, aber immer langsamer.
Wie kann man die offenen Tranksaktionen schließen? Vielleicht reicht das aus.

@WoGe:

Zitat:

Zitat von WoGe
Verwendet habe ich die IBX-Komponenten und die Werte mit einer Query ala Insert into eingetragen.


ich benutze FibPlus die sollten für Firebird eigentlich besser geeignet sein.


Bis bald Chemiker

mkinzler 25. Jan 2009 09:00

Re: Firebird wird beim Append von Datensätze immer langsamer
 
Zudem würde ich überprüfen, ob wirklich jeder Insert in eine eigene Transaktion gekapselt werden muss.

haentschman 25. Jan 2009 09:04

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

Zudem würde ich überprüfen, ob wirklich jeder Insert in eine eigene Transaktion gekapselt werden muss.
...stimmt. Wahrscheinlich nicht. :P

...zu spät gelesen :roll:
Zitat:

Aber mal eine andere Frage, ich lassen noch ein DBGrid mitlaufen, kann das mit zunehmender Anzahl an Datensätze die Datenbank ausbremsen?
...ja logisch und bei der Menge erst recht. Das Grid aktualisiert sich quasi kpl. mit jedem neuen Datensatz.
Entweder Grid raus oder die Aktualisierung unterbinden. Da gibt es für Deaktivieren und Aktivieren Befehle.
...ohne Gewähr DisableControls und EnableControls des Grid (kann ich mir nie merken :? )

TBx 25. Jan 2009 12:15

Re: Firebird wird beim Append von Datensätze immer langsamer
 
  • ich würde auf gar keinen Fall ein Grid verwenden, ggf. ein DBText oder DBEdit, da kannst Du an der Änderung ja sehen, dass nochwas passiert.
  • Was willst Du hier testen? Nur Testdatensätze erstellen für weitere Tests oder das Einfügen direkt testen? Wenn Du nur Testdatensätze generieren möchtest, solltest Du mal schauen, ob Du die Generierung nicht in eine Stored Procedure kapseln kannst. Schneller als direkt auf dem DB-Server wirst Du keine Testdatenerstellung bekommen.
  • bloß nicht jeden INSERT commiten. Bau Dir was ein, dass Du z.B. alle 500 INSERTS ein COMMIT machst, dann solltest Du eine annehmbare Geschwindigkeit haben

Hoffe, diese stichwortartigen Bemerkungen helfen Dir weiter

haentschman 26. Jan 2009 18:01

Re: Firebird wird beim Append von Datensätze immer langsamer
 
...und wie ist der Stand ? :roll:

Chemiker 26. Jan 2009 19:07

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

@Andreas:

Zitat:

Zitat von Andreas
...ohne Gewähr DisableControls und EnableControls des Grid (kann ich mir nie merken

mit Gewähr.

Es ist eine Verbesserung eingetreten, aber noch nicht gut genug. Habe jetzt das ganze DBGrid rausgenommen.

@Tbx:

Zitat:

Zitat von Tbx
ich würde auf gar keinen Fall ein Grid verwenden, ggf. ein DBText oder DBEdit, da kannst Du an der Änderung ja sehen, dass nochwas passiert.

DBGrid ist raus.

Zitat:

Zitat von Tbx
Was willst Du hier testen? Nur Testdatensätze erstellen für weitere Tests oder das Einfügen direkt testen? Wenn Du nur Testdatensätze generieren möchtest, solltest Du mal schauen, ob Du die Generierung nicht in eine Stored Procedure kapseln kannst. Schneller als direkt auf dem DB-Server wirst Du keine Testdatenerstellung bekommen.

Es sind Testdatensätze um die Datenbank mit einer entsprechenden Anzahl Datensätze auszustatten für spätere Abfragen und einfügen von Datensätze.
Mit Stored Procedure weis ich nicht ob das geht. Als Messwerte werten zufällige Zahlen generiert, die sich aber zwischen 2 Grenzen bewegen sollen die usw.

Zitat:

Zitat von Tbx
bloß nicht jeden INSERT commiten. Bau Dir was ein, dass Du z.B. alle 500 INSERTS ein COMMIT machst, dann solltest Du eine annehmbare Geschwindigkeit haben

Ich habe das einfügen jetzt auf Insert umgestellt, die Transaktionskontrolle geht wohl automatisch, bin aber noch dabei das umzustellen. Habe den Timer herausgenommen und durch eine simple For-Schleife ersetzt.
Hier mal jetzt der Quellcode nach der Umstellung:

Delphi-Quellcode:
////////////////////////////////////////////////////////////////////////////////
{
********************************************************************************
Datensätze in die Datenbank einfügen
********************************************************************************
}
procedure dbEinfügenSQL(const aMAArr: TArrMSRec;
                        var apFIBTransaction: TpFIBTransaction;
                        var aPFIBDataSet: TpFIBDataSet;
                        const aDatumUhrzeit: TDateTime;
                        const ai: Integer;
                        var abME: Boolean);
var
  strText: String;
  dbZahl: Double;
  strSende: String;
  z: Integer;
begin
  for z := 0 to high(aMAArr) do
  begin
   strSende:= ZufallMSmitWert(aMAArr[z].FMAID,
                              aMAArr[z].FMWMinBereich,
                              aMAArr[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
    aPFIBDataSet.Insert;
    aPFIBDataSet['MW_MSID']:= strText;
    aPFIBDataSet['MW_MW']:= dbZahl;
    apFIBDataSet['MW_DATUMUHRZEIT']:= aDatumUhrzeit;
  end else
  begin
    if ai = 70 then
    begin
      aPFIBDataSet.insert;
      aPFIBDataSet['MW_MSID']:= strText;
      aPFIBDataSet['MW_MW']:= dbZahl;
      apFIBDataSet['MW_DATUMUHRZEIT']:= aDatumUhrzeit;
      abME:= TRUE;
    end;
   end;
 end;
end;
////////////////////////////////////////////////////////////////////////////////
Insgesamt haben die Maßnahmen dafür gesorgt, dass ein Datensatz in ca. 1 sek angelegt wird. Ich werde aber versuchen das noch weiter zu verbessern. Das Testen ist nur sehr langwierig, weil man erst nach ca. 30.000 – 40.000 Datensätze feststellt, ob die Änderung was gebracht hat. Was auf jeden Fall stört ist die BDS 2006, weil mit zunehmender Zeit immer mehr virtueller Speicher verbraucht wird, ohne dass man irgendetwas mit ihr macht.

Ich wollte noch ein Backup von der Datenbank-Datei machen, aber bisher ohne Erfolg.
Habe mir eine bat. – Datei geschrieben um ein Backup (mit gbak.exe) von der Datenbank zu bekommen, leider kommt immer eine Fehler-Meldung. Mit IBExpert ist mir auch noch kein Backup gelungen, weil immer eine DLL-Datei, oder der Server-Name fehlt.
Zitat:

Zitat von Andreas
...und wie ist der Stand ?

Soweit ein Zwischenbericht, wie geschrieben ich werde noch weitere Optimierungen ausprobieren.
Bis bald Chemiker


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:39 Uhr.
Seite 2 von 3     12 3      

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-2025 by Thomas Breitkreuz