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 2 von 3     12 3      
Benutzerbild von Chemiker
Chemiker

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

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

  Alt 25. Jan 2009, 08:39
Hallo Andreas,

die alte Datenbank.


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

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

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

  Alt 25. Jan 2009, 08:43
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) )

  Mit Zitat antworten Zitat
WoGe

Registriert seit: 16. Jun 2005
Ort: Kelkheim
178 Beiträge
 
Delphi 10.3 Rio
 
#13

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

  Alt 25. Jan 2009, 08:45
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
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman
Online

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

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

  Alt 25. Jan 2009, 08:51
...ich bin zwar kein FIB Experte 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;
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.858 Beiträge
 
Delphi 11 Alexandria
 
#15

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

  Alt 25. Jan 2009, 08:58
Hallo,

@ Andreas:

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 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 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
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

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

  Alt 25. Jan 2009, 09:00
Zudem würde ich überprüfen, ob wirklich jeder Insert in eine eigene Transaktion gekapselt werden muss.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman
Online

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

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

  Alt 25. Jan 2009, 09:04
Zitat:
Zudem würde ich überprüfen, ob wirklich jeder Insert in eine eigene Transaktion gekapselt werden muss.
...stimmt. Wahrscheinlich nicht.

...zu spät gelesen
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 )
  Mit Zitat antworten Zitat
TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.875 Beiträge
 
Delphi 12 Athens
 
#18

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

  Alt 25. Jan 2009, 12:15
  • 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
Thomas Breitkreuz
Gruß Thomas
- Admin DelphiPRAXIS
- Admin Delphi-Treff
- Embarcadero MVP
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman
Online

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

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

  Alt 26. Jan 2009, 18:01
...und wie ist der Stand ?
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.858 Beiträge
 
Delphi 11 Alexandria
 
#20

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

  Alt 26. Jan 2009, 19:07
Hallo

@Andreas:

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 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 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 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 von Andreas:
...und wie ist der Stand ?
Soweit ein Zwischenbericht, wie geschrieben ich werde noch weitere Optimierungen ausprobieren.
Bis bald Chemiker
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 08:50 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