AGB  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Beschleunigungstips für SQLite unter Android erwünscht

Beschleunigungstips für SQLite unter Android erwünscht

Ein Thema von sko1 · begonnen am 17. Mai 2017 · letzter Beitrag vom 19. Mai 2017
Antwort Antwort
Seite 2 von 2     12
mjustin

Registriert seit: 14. Apr 2008
2.465 Beiträge
 
Delphi 2009 Professional
 
#11

AW: Beschleunigungstips für SQLite unter Android erwünscht

  Alt 17. Mai 2017, 13:29
Optimierungstipp von https://stackoverflow.com/a/28188228/80901

* eine Transaktion verwenden

Michael Justin
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
1.167 Beiträge
 
Delphi 2007 Professional
 
#12

AW: Beschleunigungstips für SQLite unter Android erwünscht

  Alt 17. Mai 2017, 14:38
Transaktion hat er doch schon per SQL-Befehl.
Zu viele Inserts in einer Transaktion können aber auch bremsend wirken.
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
3.656 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#13

AW: Beschleunigungstips für SQLite unter Android erwünscht

  Alt 17. Mai 2017, 15:49
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:
 
          SQLConnection.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;
Mavarik
  Mit Zitat antworten Zitat
Daniel
(Administrator)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.984 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#14

AW: Beschleunigungstips für SQLite unter Android erwünscht

  Alt 17. Mai 2017, 16:00
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:

http://docwiki.embarcadero.com/RADSt..._DML_(FireDAC)
Daniel R. Wolf
Admin Delphi-PRAXiS
mit Grüßen aus Hamburg
>> http://forentage.de
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
3.656 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#15

AW: Beschleunigungstips für SQLite unter Android erwünscht

  Alt 17. Mai 2017, 16:03
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:

http://docwiki.embarcadero.com/RADSt..._DML_(FireDAC)
ggf. Aber auf einem Device ist eh alles RAM... Wenn man sich das Ganze mal mit Instruments anschaut (ok ist iOS) sieht man wie sich der Speicher auf und ab baut...
  Mit Zitat antworten Zitat
sko1

Registriert seit: 27. Jan 2017
328 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#16

AW: Beschleunigungstips für SQLite unter Android erwünscht

  Alt 18. Mai 2017, 08:36
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
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:
      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;
...
Aber da kommt ein Index-Fehler!
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?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
38.236 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#17

AW: Beschleunigungstips für SQLite unter Android erwünscht

  Alt 18. Mai 2017, 09:52
Ja. Die Parameterobjekte werden beim Prepare erzeugt. Die Typen musst Du auch nur einmal setzen.
Markus Kinzler
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.165 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#18

AW: Beschleunigungstips für SQLite unter Android erwünscht

  Alt 18. Mai 2017, 10:39
SQLite ist eventuell nicht die richtige Datenbank für das Datenvolumen?

Sherlock
Das glaube ich weniger. Im Netz schwirren Aussagen rum, dass SQLite mit 50GB Daten problemlos funktioniert. Dementsprechend viele Zeilen und Spalten hat die Datenbank dann auch.

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.
  Mit Zitat antworten Zitat
sko1

Registriert seit: 27. Jan 2017
328 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#19

AW: Beschleunigungstips für SQLite unter Android erwünscht

  Alt 19. Mai 2017, 10:56
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
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:54 Uhr.
Powered by vBulletin® Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2017 by Daniel R. Wolf