Einzelnen Beitrag anzeigen

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