![]() |
AW: Beschleunigungstips für SQLite unter Android erwünscht
|
AW: Beschleunigungstips für SQLite unter Android erwünscht
Transaktion hat er doch schon per SQL-Befehl.
Zu viele Inserts in einer Transaktion können aber auch bremsend wirken. |
AW: Beschleunigungstips für SQLite unter Android erwünscht
Also ich mache das so... ca. 45000 Datensätze und 37 Felder. Dauert ca 18-25 Sekunden je nach Device. Der Source ist noch aus den Anfängen... Heute würde ich es auch anders machen...
Delphi-Quellcode:
MavarikSQLConnection.Open; Felder := MakeFieldDef(FRecordDef); SQLQuery.SQL.Text := 'BEGIN;'; SQLQuery.ExecSQL(true); while not(SQLReader.eof) do begin SQLReader.ReadSQLCrypt; // Lade die Daten aus einer verschlüsselten Datei inc(Count); if (Count mod 100) = 0 then StatusProg('',100.0 / MaxSize * SQLReader.Position,FloattoStrF(100.0 / MaxSize * SQLReader.Position,ffFixed,7,2)+'%'); D := SQLReader.GetSQLBytes; SQLQuery.SQL.Text := 'INSERT INTO '+FTableName+' ('+Felder+') VALUES (0,'+D+PostFields+');'; try SQLQuery.ExecSQL(false); except StatusProg('EXCEPTION',0,''); end; end; StatusProg('',100.0,SIndexWait); // 'Erzeuge Index, Bitte warten...' SQLQuery.SQL.Text := 'COMMIT;'; SQLQuery.ExecSQL(true); SQLConnection.Close; |
AW: Beschleunigungstips für SQLite unter Android erwünscht
Die Array-DML von FireDAC könnte helfen. Sofern auf dem Gerät SQLite in Version >= 3.7.11 läuft, wird dieses Vorgehen auch von der DB unterstützt:
![]() |
AW: Beschleunigungstips für SQLite unter Android erwünscht
Zitat:
|
AW: Beschleunigungstips für SQLite unter Android erwünscht
Hallo,
nun habe ich einiges getestet, die Variante alle SQL's mit SQL.Add gemeinsam abzufeuern brachte kaum etwas, die Variante Prepare mit Parameters hat eine deutliche Beschleunigung gebracht :thumb: Dabei habe ich die Parameter per Index und nicht per Name angesprochen. Da ich verschiedene Inserts mit einer unterschiedlichen Anzahl von Feldern habe, dachte ich ich kann gleich zu Beginn alle Parameter einstellen:
Delphi-Quellcode:
Aber da kommt ein Index-Fehler!
FDQuery.Params[0].DataType := Tfieldtype.ftAutoInc;
FDQuery.Params[1].DataType := Tfieldtype.ftString; FDQuery.Params[2].DataType := Tfieldtype.ftString; FDQuery.Params[3].DataType := Tfieldtype.ftString; FDQuery.Params[4].DataType := Tfieldtype.ftString; ... Es sieht so aus als ob erst das SQL-Statement gesetzt werden muss und dann nur genau die Anzahl Parameter eingestellt werden darf die im SQL vorkommen? Irgendwie möchte ich noch etwas an Verarbeitungszeit "herauskitzeln"! Noch Ideen? |
AW: Beschleunigungstips für SQLite unter Android erwünscht
Ja. Die Parameterobjekte werden beim Prepare erzeugt. Die Typen musst Du auch nur einmal setzen.
|
AW: Beschleunigungstips für SQLite unter Android erwünscht
Zitat:
Es gibt eine alte Seite auf der SQLite HomePage. Dort werden Geschwindigkeiten verglichen in denen eine alte Version von SQLite schon sehr gut abgeschnitten hat. Allerdings steht auch in roter Schrift darüber, dass diese Seite nicht mehr aussagekräftig ist. Deshalb verlinke ich die hier jetzt mal nicht. Über Google kann man die aber sehr schnell selbst finden wenn man sie denn sehen möchte. |
AW: Beschleunigungstips für SQLite unter Android erwünscht
So, nachdem ich alle Eure Tips getestet und teilweise umgesetzt habe (je nach Verbesserung der Laufzeit) bin ich jetzt von meinen 4-5 Minuten auf ca. 20 Sekunden herunter, dazu ein Fortschrittsbalken für den Anwender und alles ist gut!
Danke für Eure Tips! Ciao Stefan |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz