SQLite-Geschwindigkeit

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
TKindermann
Beiträge: 22
Registriert: Mi 19. Mai 2010, 07:23

SQLite-Geschwindigkeit

Beitrag von TKindermann »

Hallo zusammen,
ich bin ziemlich neu hier , und traue mich einfach mal eine Frage zustellen :roll: .

Ich schreibe ein Programm das eine Textdatei einliest und dann die Daten in eine lokale Datenbank speichern soll.
dabei soll keine Datenbank auf dem Rechner installiert werden.

Das Volumen beträgt ca 3000 Datensätze, die in einem Rutsch geschrieben werden sollen

ich habe mir zuerst SQLite angeschaut.

Mein Test ergab allerdings Zeiten von ca 2 Minuten für 1000 Datensätze. das ist mir zu langsam :(

Mein Code sieht folgendermaßen aus

Code: Alles auswählen

For iLine := 0 to 1000 do 
   begin
    SQLite3.SQLList.add('INSERT INTO INDI (INDI) VALUES ("' + IntTostr(iLine) +'");');
   end;
  SQLite3.ExecSQLList;
Also nichts aufregendes. Was mache ich Falsch, bzw gibt es eine besserer Alternative?

vielen dank im Voraus

Thomas

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6766
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: SQLite-Geschwindigkeit

Beitrag von af0815 »

Wofür wird die DB dann verwendet ?
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

TKindermann
Beiträge: 22
Registriert: Mi 19. Mai 2010, 07:23

Re: SQLite-Geschwindigkeit

Beitrag von TKindermann »

In die DB sollen GEDCOM-Dateien eingelesen werden (bekannt aus der Ahnenforschung).

Nach dem Import-Vorgang erfolgen nur noch SELECT-Befehle auf die Daten um Reports zu erzeugen.

Thomas

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6766
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: SQLite-Geschwindigkeit

Beitrag von af0815 »

Die Frage ist, ob man sich bei 3000 Datensätze den Overhead von einer SQL-Engine antun muß/soll. Mir ist klar, das das verwenden von SELECT ein gewaltiger Vortteil sein kann :-)

Die Frage ist, muß es SQL sein (für die Reports) oder reicht es wenn man einfache Datasets (zB. Memdataset) verwendet, oder hält das ganze in einer TList ?
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: SQLite-Geschwindigkeit

Beitrag von mse »

TKindermann hat geschrieben: Also nichts aufregendes. Was mache ich Falsch, bzw gibt es eine besserer Alternative?
Die inserts müssen in eine gemeinsame Transaktion gepackt werden, ansonsten wird bei jedem insert statement ein disk flush ausgeführt. Zudem dürfte ein 1000 mal aufgerufenes prepared statement schneller sein als 1000 einzelne statements.

gekkonier
Beiträge: 1
Registriert: Mi 7. Jul 2010, 14:58

Re: SQLite-Geschwindigkeit

Beitrag von gekkonier »

Auslesen wird ja wesentlich schneller als reinschreiben gehn bei SQLite. Also ists ja eigentlich kein Problem, wenn sehr selten nach dem Import die Daten geändert werden ;)

TKindermann
Beiträge: 22
Registriert: Mi 19. Mai 2010, 07:23

Re: SQLite-Geschwindigkeit

Beitrag von TKindermann »

mse hat geschrieben:
TKindermann hat geschrieben: Also nichts aufregendes. Was mache ich Falsch, bzw gibt es eine besserer Alternative?
Die inserts müssen in eine gemeinsame Transaktion gepackt werden, ansonsten wird bei jedem insert statement ein disk flush ausgeführt. Zudem dürfte ein 1000 mal aufgerufenes prepared statement schneller sein als 1000 einzelne statements.

Danke für die Antwort, In so eine Richtung habe ich auch gedacht. Ich komme selber von der Oracle-Seite und bin mit SQLite noch nicht so im Thema :wink:
Wie kann ich mit SQLite eine Transaction definieren und wie funktioniert das mit einem 'Prepared' Statement?

Gibt es irgendwo Beispielcode?

Thomas

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: SQLite-Geschwindigkeit

Beitrag von mse »

TKindermann hat geschrieben: Gibt es irgendwo Beispielcode?
Ich kenne mich nur mit MSEide+MSEgui aus. Dort sind die SQlite3 statements grundsätzlich prepared. Um explizite Transaktionen einzuschalten gibt es das flag tsqlite3connection.options slo_transactions. Transaktionen sind in SQlite3 als filelocks realisiert was zu Problemen führen kann, daher ist die option standardmässig aus.

Martin

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6766
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: SQLite-Geschwindigkeit

Beitrag von af0815 »

TKindermann hat geschrieben: Wie kann ich mit SQLite eine Transaction definieren und wie funktioniert das mit einem 'Prepared' Statement?

Gibt es irgendwo Beispielcode?
z.B. Lazarus Wiki -> Lazarus_Database_Tutorial

bzw. in der Lazarus Wiki Suche 'transaction' eingeben. Das DB System ist bei den allgemeinen Komponenten nicht so wichtig, es geht überall gleich.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

TKindermann
Beiträge: 22
Registriert: Mi 19. Mai 2010, 07:23

Re: SQLite-Geschwindigkeit

Beitrag von TKindermann »

Super, Danke, Danke, Danke

hätt ich auch selber drauf kommen können :roll:

Hab Begin Transaction und Commit eingebaut und bin bei ca 10 Sekunden für 10000! Datensätze

Super und Danke nochmal

Viele Grüße aus Düsseldorf...

Antworten