2016-07-03 29 views
1

Ich verwende Zeoslib, um In-Memory-Datenbanken mit SQLite zu erstellen, und ich muss die Datenbank auf der Festplatte speichern, wenn das Programm geschlossen wird, oder es regelmäßig in eine Datei ablegen.Gibt es SQLite-Befehle, die eine SELECT-Abfrage als SQL-Einfügebefehle ausgeben können?

Da das SQLite3-Programm nicht in Speicherdatenbanken verarbeiten kann, gibt es eine Möglichkeit, SQLite die Ausgabe einer SELECT Abfrage als INSERT Anweisungen zu exportieren?

PS. sqlite3 kann eine in der Arbeitsspeicherdatenbank auf die Festplatte ausgeben, wie in diesem Thread angegeben, aber die speicherinterne Datenbank wird von einer anderen Anwendung erstellt, weshalb ich nicht sehen kann, wie das Beispiel funktioniert.

+0

Wenn Sie eine Datei möchten, warum verwenden Sie überhaupt eine In-Memory-DB? –

+0

Ich brauche die Geschwindigkeit der In-Memory-Verarbeitung, aber ich möchte es auf Festplatte speichern, wenn ich fertig bin. – vfclists

Antwort

2

Um eine Arbeitsspeicher-DB auf Festplatte zu speichern, erstellen Sie eine Kopie mit SQLite backup API. Dies erfordert, dass Ihr Datenbanktreiber die Sicherungs-API tatsächlich unterstützt. Zeos scheint das nicht zu tun.


Was eine Datenbank auf der Festplatte macht so langsam sind nicht die Plattenzugriffe selbst (die meisten im Cache gespeichert werden kann), aber die Synchronisationen, um sicherzustellen, dass die DB intakt bleibt, auch wenn das Programm oder der Computer zum Absturz bringen.

Es gibt eine Reihe von Einstellungen, die Geschwindigkeit zu erhöhen, auf Kosten der Herstellung eine On-Disk-DB als unsicher als In-Memory-Datenbank:

  • Set PRAGMA synchronous-OFF:

    Mit synchronem AUS (0) wird SQLite ohne Synchronisierung fortgesetzt, sobald Daten an das Betriebssystem übergeben wurden. Wenn die Anwendung, auf der SQLite ausgeführt wird, abstürzt, sind die Daten sicher, aber die Datenbank wird möglicherweise beschädigt, wenn das Betriebssystem abstürzt oder der Computer Strom verliert, bevor diese Daten auf die Plattenoberfläche geschrieben wurden. Auf der anderen Seite können Commits bei synchronem OFF um Größenordnungen schneller sein.

  • Set PRAGMA journal_mode auf MEMORY:

    Speichermodus Journaling speichert das Rollback-Journal im flüchtigen RAM. Dies spart Festplatten-E/A, aber auf Kosten der Datenbanksicherheit und -integrität. Wenn die Anwendung, die SQLite verwendet, mitten in einer Transaktion abstürzt, wenn der Journalmodus MEMORY festgelegt ist, wird die Datenbankdatei sehr wahrscheinlich beschädigt.

  • Erhöhung PRAGMA cache_size (die Standardeinstellung ist normalerweise nur 2 MB);

  • Deaktivieren PRAGMA secure_delete.