[gelöst] DBGrid bei Firebird Datenbank Abfragen bei Zeilenanzahl > 100.000 sehr langsam

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Soner
Beiträge: 513
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: DBGrid bei Firebird Datenbank Abfragen bei Zeilenanzahl > 100.000 sehr langsam

Beitrag von Soner »

@lcb-User
Respekt, gut gedacht, bei mir braucht es auch für 100.000 Datensätze unter 1 Sekunde. Und der Speicherverbrauch ist nur 563 MB.

Helios
Lazarusforum e. V.
Beiträge: 93
Registriert: Mi 29. Jun 2011, 22:36
OS, Lazarus, FPC: Lazarus 2.2.0 Windows 10 64Bit / Lazarus 2.0.12 Debian 11 „Bullseye" 64Bit
CPU-Target: 64Bit
Wohnort: Leonberg

Re: DBGrid bei Firebird Datenbank Abfragen bei Zeilenanzahl > 100.000 sehr langsam

Beitrag von Helios »

Hallo lcb-User,

hammer, das ist ne super Lösung! Vielen, vielen Dank!
Mit einer Zeile Code hast Du das Laufzeitproblem gelöst und die Datenbank(datei)größe auf ca. 1/4 geschrumpft. Wenn das nicht 2 Fliegen mit einer Klappe sind :D .
Einen kleinen Beitrag (nach der Vorarbeit von Dir) kann ich (nach entsprechender Recherche)noch bringen:
Mit

Code: Alles auswählen

  IBConnection1.Charset := 'ISO8859_1';
muss man nicht auf die deutschen Umlaute in den Daten verzichten, und bleibt entsprechend schnell.
Jetzt geht es mit Lazarus in dem Projekt weiter.
Vielen Dank nochmal, auch an alle die hier mitgeholfen haben
Gruß
Euer Helios

PS: Hier noch die Version 3.0 mit der Lösung. Bei mir auch noch bis mind. 1.000.000 Zeilen verwendbar. Keine Angst, ich werde die DBA's nicht ärgern 8) :lol:.Bitte Plattenplatz für die lokale Datenbank sicherstellen, bei mir waren es 360MB.
Viel Spass beim Testen/Ausprobieren:
Dateianhänge
DBGridFireBirdTest.V3.0.zip
(129.82 KiB) 73-mal heruntergeladen

Benutzeravatar
lcb-User
Beiträge: 23
Registriert: Di 15. Jul 2014, 13:18
OS, Lazarus, FPC: Linux Mint 20.1 Cinnamon, Lazarus 2.0.12-gtk2, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: München

Re: DBGrid bei Firebird Datenbank Abfragen bei Zeilenanzahl > 100.000 sehr langsam

Beitrag von lcb-User »

Hallo Helios

Freud mich das es geholfen hat :-)

Ich hab mich für das Testprogramm zu bedanken. Das hat mein Augenmerk auf etwas ganz anderes gelenkt:

Das anlegen und löschen von temporärer Datenbank im Server - Client System.
Firebird legt wenn es keine angaben hat, wo hin es die Datei ablegen soll, in den /temp Ordner ab. Wenn man das nicht auf dem Schirm hat meint man dass alles funktioniert hat aber beim Neustart vom Server ist alles weg. ;-)

Dieses Verhalten ist aber genial wenn man nur zur Laufzeit Datenbank anlegen und kurzfristig braucht.
Für's löschen gibt's dann noch eine Funktion IBConnection1.DropDB

Hier meine Anpassungen für die die es interessiert.

Code: Alles auswählen

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: boolean);
begin 
  IBConnection1.Connected := False;
  try
    IBConnection1.DropDB;  // DropDB wirft einen Fehler wenn IBConnection noch aktiv ist
  except
  end;
end;   

procedure TForm1.Button1Click(Sender: TObject);
begin
  SQLTransaction1.Active  := False;
  IBConnection1.Connected := False;

  // Achtung Datei "TestDB.FDB" im aktuellen Verzeichnis wird gnadenlos gelöscht!!!!
  // DeleteFile('TestDB.FDB');
  IBConnection1.DatabaseName := 'TestDB.FDB';
  IBConnection1.UserName := 'SYSDBA';
  IBConnection1.Password := 'masterkey';
  IBConnection1.Charset  := '';
  // 'ISO8859_1'; //Small character set for a small database and performent TSQLQuery. Thanks to lcb-User at www.lazarusforum.de
  IBConnection1.Dialect  := 3; //Nobody uses 1 or 2 anymore.
  IBConnection1.Params.Add('PAGE_SIZE=8192');
  IBConnection1.HostName := 'localhost';
  //IBConnection1.Params.Add('PAGE_SIZE=16384');
  try
    IBConnection1.DropDB;
  except
  end;
  IBConnection1.CreateDB;
  IBConnection1.Transaction := SQLTransaction1;
  IBConnection1.Open;

  SQLTransaction1.StartTransaction;
  IBConnection1.ExecuteDirect(
    'CREATE TABLE messwerte (id BIGINT, system VARCHAR(240), kategorie VARCHAR(240), format VARCHAR(5), code VARCHAR(1000), langtext VARCHAR(1000), wert VARCHAR(8000), einheit VARCHAR(240))');
  IBConnection1.ExecuteDirect('CREATE UNIQUE INDEX messwerte_idx1 ON messwerte(id)');
  //IBConnection1.ExecuteDirect('CREATE INDEX messwerte_idx1 ON messwerte(diagnosesystem)');
  //IBConnection1.ExecuteDirect('CREATE INDEX messwerte_idx2 ON messwerte(kategorie)');
  //IBConnection1.ExecuteDirect('CREATE INDEX messwerte_idx3 ON messwerte(bezeichnung)');
  //gstat C:\Arne\DevWork\Pascal\data\FAP\FAP.FDB -u SYSDBA -p masterkey -r
  SQLTransaction1.Commit;

  FillDBGrid();
end;  

Sonnige Grüße aus München

Helios
Lazarusforum e. V.
Beiträge: 93
Registriert: Mi 29. Jun 2011, 22:36
OS, Lazarus, FPC: Lazarus 2.2.0 Windows 10 64Bit / Lazarus 2.0.12 Debian 11 „Bullseye" 64Bit
CPU-Target: 64Bit
Wohnort: Leonberg

Re: DBGrid bei Firebird Datenbank Abfragen bei Zeilenanzahl > 100.000 sehr langsam

Beitrag von Helios »

Hallo lcb-User,
auch für diesen Tipp vielen Dank. Der kommt sicher bald zur Anwendung :D .
Ich bin ja noch grade am Anfang des Projekts aber die Lernkurve (Dank der Hilfe hier aus dem Forum) ist sehr steil.
Schönes Wochenende und Grüße aus Leonberg.
Helios

Antworten