Es gibt mehrere Ansätze Daten mit SQLite effektiv zu speichern und sie schnellstmöglich zu schreiben und abzufragen. Chris Schirlinger hat einen recht umfangreichen Artikel zum Thema Performancetuning unter Windows veröffentlicht. Er rät, SQLite so direkt wie möglich zu verwenden und auf Wrapper zu verzichten. Da der Quellcode frei erhältlich ist, ist es möglich, ihn in eine Anwendung, die Daten strukturiert speichern, soll zu integrieren und mit dem Programm zusammen zu kompilieren.
Seinem Vorschlag, nach dem Anlegen einer DB ihre Seitengröße mit der Anweisung PRAGMA page_size=4096; auf 4 kB festzulegen, und sie somit für NTFS-Dateisysteme zu optimieren, kann man umgehen, wenn man das ganze Programm incl. SQLite mit dem Kompilerschalter -DSQLITE_DEFAULT_PAGE_SIZE=4096 kompiliert.

Mir geht es in dieser Abhandlung um das schnellstmögliche Einfügen größerer Datenmengen in eine DB.
Im einfachsten Fall öffnen wir eine Datenbank und führen so viele INSERT-Statements aus, wie wir Daten haben. So sieht's aus:
Deutlich schneller geht das schonmal, wenn man Transaktionen verwendet. Hierzu führt man vor dem ersten INSERT den Befehl BEGIN; aus, und beendet die Transaktion mit COMMIT;.
Mit Prepared Statements sieht das ganze dann so aus, und geht nochmal schneller.
Am schnellsten ist es aber wohl mit Prepared Statements zu arbeiten, und die Parameter selber zu handeln. Beispiel
In der Datei SQLite3.h ist zwar eine Funktion int sqlite3_bind_value(sqlite3_stmt*, int, const sqlite3_value*); deklariert, diese ist aber nirgends definiert. Obiges Beispiel basiert darauf, dass man die Parameter, die sqlite3_prepare(...) vorbereitet und zur Verfügung stellt, direkt manipuliert. Die Angaben um welchen Datentyp es sich handelt etc. nehmen wir hier für beliebig viele INSERTs genau einmal vor. Für den einzufügenden String legen wir einmal einen Puffer fest, dessen Inhalt bei jedem Schleifendurchlauf geändert wird. Die tatsächliche Länge des Strings muss in jedem Durchlauf explizit angegeben werden. Für Strings nimmt die Variablenstruktur Mem (p->aVar ist ein Array von Mems) einen Zeiger entgegen (Member z), Zahlenwerte speichert sie direkt (Member i für Ganzzahlen und r für Fließkommazahlen).
Coldfusion
->SerializeJSON

GCC
->Cross-Compiling

MySql
->Prep. Stmts

SQLite3
->Mem-Structure
->Prep. Stmts
->ToUTF8-Func
->ToWin1252-Func

UTF-8
->UTF-8 To UCS2

VB
->MD5-Class

VC++
->BZip2
->ATL


HOME