2 Stimmen

SQLite ist auf dem Samsung Galaxy GT-I9000 extrem langsam

Ich habe ein Problem mit der Leistung der SQLite-Datenbank in der Android-Anwendung auf dem Gerät Samsung Galaxy GT-I9000. Die Datenbank enthält 10 Tabellen mit jeweils 3 - 8 Spalten.

Sobald eine Datenbankdatei etwa 400 KB groß ist, benötigen Aktualisierungs-/Installationsabfragen viel mehr Zeit zur Ausführung - 2 Sekunden! Im Vergleich zu anderen Geräten (HTC Magic, HTC Desire) dauern Update-/Insert-Abfragen etwa 40 msec!

Die Datenbankdatei befindet sich im Verzeichnis der Anwendungsdaten. Das Verschieben der Datenbankdatei auf die SD-Karte erhöht die Geschwindigkeit erheblich.

Periodische ANALYZE- und VACUUM-Befehle haben keinen Einfluss auf die Geschwindigkeit. Ebenso wie der Befehl PRAGMA cache_size.

Haben Sie eine Idee, wie man die Leistung verbessern kann?

Jede Idee ist willkommen, außer die Datenbank auf einer SD-Karte zu speichern oder die Datenbank in mehrere Dateien mit je einer Tabelle aufzuteilen.

4voto

Mad Scientist Punkte 17347

Der Zugriff auf die interne SD-Karte ist bei dem Samsung Galaxy S sehr langsam. inoffizielle Lag-Behebungen verfügbar ist, scheint es, dass das RFS-Dateisystem von Samsung für die Verzögerungen verantwortlich ist.

Hoffentlich bringt Samsung ein Update heraus, das dieses Problem behebt. Bis dahin ist es am besten, I/O zu vermeiden, wenn möglich.

3voto

TTT Punkte 2355

Verwenden Sie Transaktionen und parametrisierte Abfragen. Sqlite muss jede Sql-Anweisung parsen, wenn Sie keine parametrisierten Abfragen verwenden. All dieses unnötige Parsing macht eine einfache Insert-Anweisung 2 bis 3 Mal langsamer. Siehe hier: Wie kann ich das "'"-Problem in Sqlite und c# umgehen?

Die Verwendung von Transaktionen ist ebenfalls sehr wichtig, da Sqlite eine Einfügung sehr schnell durchführen kann, aber Commits langsam sind, so dass Sie Einfügungen/Aktualisierungen und Löschungen in einer großen Transaktion bündeln müssen.

2voto

MPelletier Punkte 15633

Bulk-Insert-Befehle sollten innerhalb einer Transaktion ausgeführt werden:

BEGIN TRANSACTION;
// INSERTS
COMMIT;

2voto

plugmind Punkte 7816

Das hat mir sehr geholfen und mich motiviert, noch mehr zu suchen. Und ich habe eine Lösung gefunden, die mir einen großen Schub gibt:

PRAGMA synchron=OFF

INSERT/UPDATE-Abfragen laufen jetzt 4 Mal schneller.

Sie hat jedoch einen kleinen Nachteil.

Weitere Einzelheiten finden Sie hier:
http://web.utk.edu/~jplyon/sqlite/SQLite_Optimierung_FAQ.html#pragmas

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X