Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Zugriff auf SQlite extrem langsam (https://www.delphipraxis.net/148394-zugriff-auf-sqlite-extrem-langsam.html)

R2009 1. Mär 2010 08:16

Datenbank: SQlite • Zugriff über: sqlitewrap

Zugriff auf SQlite extrem langsam
 
Hi DP'ler,

ich habe angefangen rudimentäre Tests für ein neues Tool durchzuführen.

Folgende Vorgaben muss ich einhalten:
1.) Das Tool soll voll Datenbankunterstützt laufen.
2.) Die Schnittstelle zur Datenbank soll pur auf SQL basieren. (Rückgabe durch dynamische Arrays.)

Bei mir stellt sich jetzt, in Bezug auf SQlite, folgendes Problem:

Wir benutzen sehr viele einfache Parameterfenster. Beim öffnen der Fenster hole ich die Daten
aus der Datenbank und weisse diese den entsprechenden Feldern (Tedit, Combobox usw) zu.
Das geschieht alles automatisch und funktioniert ohne Probleme.
Beim verlassen der Fenster muss dieser Vorgang umgekehrt laufen.
Dort gibt es massive Performanceprobleme.
Das Updaten dauert für ca 50 Editfelder oder Komboboxen um die 10 Sekunden.

Delphi-Quellcode:
             if li='' then li:='empty';
             SQL:='select * from Parameters where NAME = '+chr(39)+name+chr(39);
             tab := db.GetTable(sql);
             If tab.FieldAsString(1)<>li then
                begin
                  SQL:='update Parameters set VALUE = '+chr(39)+li+chr(39)+' where NAME = '+chr(39)+name+chr(39);
                  try
                    DB.ExecSQL(SQL);
                    main_form.memo1.lines.Add('update');
                  except
                    SQL:='insert into Parameters (NAME,VALUE) values ('+chr(39)+name+chr(39)+','+chr(39)+li+chr(39)+')';
                    DB.ExecSQL(SQL);
                    main_form.memo1.lines.Add('insert');
                  end;
                end;
Vielleicht hat irgendjemand eine Idee wie man das Ganze etwas beschleunigen kann.
Die memo-einträge habe ich nur zum Testen im Code!

Bernhard Geyer 1. Mär 2010 08:29

Re: Zugriff auf SQlite extrem langsam
 
Verwende prepared Statements.
Sollte auch bei SQLite einiges bringen.

HeikoAdams 1. Mär 2010 09:10

Re: Zugriff auf SQlite extrem langsam
 
Auch wenn das jetzt nicht 100% zum Thema passt, aber auf Sachen wie
Delphi-Quellcode:
If tab.FieldAsString(1)<>li then
würde ich, soweit es geht, versuchen zu verzichten. Ein Feld über seinen Index anzusprechen kann schnell zu Problemen führen, sobald sich die Struktur der Tabelle oder die Reiehnfolge der Felder im Select ändert.

mse1 1. Mär 2010 09:49

Re: Zugriff auf SQlite extrem langsam
 
Zitat:

Zitat von R2009
Vielleicht hat irgendjemand eine Idee wie man das Ganze etwas beschleunigen kann.

Packe die einzelnen update statements in eine gemeinsame Transaktion damit nicht bei jedem einzelnen SQL Kommando ein disk flush durchgeführt wird. Dies wirkt Wunder. :-)

Martin

R2009 1. Mär 2010 12:50

Re: Zugriff auf SQlite extrem langsam
 
Hi mse1,

wenn du mir jetzt noch erklärst wie man das bei SQlite macht bin ich glücklich!

Grüsse
Rainer

R2009 1. Mär 2010 13:13

Re: Zugriff auf SQlite extrem langsam
 
Hi mse1,

ich glaube ich habs kapiert:
mit Start(....)
und commit(...)

Grüsse
Rainer

Die Muhkuh 1. Mär 2010 13:23

Re: Zugriff auf SQlite extrem langsam
 
Kann SQLite keine parametisierte SQL-Statements? Würde die Darstellung deutlich schöner machen

mse1 1. Mär 2010 13:42

Re: Zugriff auf SQlite extrem langsam
 
Zitat:

Zitat von R2009
wenn du mir jetzt noch erklärst wie man das bei SQlite macht bin ich glücklich!

Das kommt auf die verwendeten Komponenten an. Für MSEgui gibt es das Flag slo_transactions in tsqlite3connection. Direkt in SQL geht es mit BEGIN und COMMIT.
http://www.sqlite.org/lang_transaction.html


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:25 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