Also habe ich einige Tests mit SQLite für sehr große Dateien durchgeführt und bin zu einigen Schlussfolgerungen gekommen (zumindest für meine spezifische Anwendung).
Die Tests umfassen eine einzelne SQLite-Datei mit entweder einer einzelnen Tabelle oder mehreren Tabellen. Jede Tabelle hatte ungefähr 8 Spalten, fast alle ganzen Zahlen und 4 Indizes.
Die Idee war, genügend Daten einzufügen, bis die SQLite-Dateien etwa 50 GB groß waren.
Einzelne Tabelle
Ich habe versucht, mehrere Zeilen mit nur einer Tabelle in eine SQLite-Datei einzufügen. Als die Datei ungefähr 7 GB groß war (leider kann ich die Anzahl der Zeilen nicht genau bestimmen), dauerte das Einfügen viel zu lange. Ich hatte geschätzt, dass mein Test zum Einfügen aller meiner Daten ungefähr 24 Stunden dauern würde, aber er wurde auch nach 48 Stunden nicht abgeschlossen.
Dies lässt mich zu dem Schluss kommen, dass eine einzelne, sehr große SQLite-Tabelle Probleme mit Einfügungen und wahrscheinlich auch mit anderen Operationen haben wird.
Ich denke, das ist keine Überraschung, da die Tabelle größer wird und das Einfügen und Aktualisieren aller Indizes länger dauert.
Mehrere Tabellen
Ich habe dann versucht, die Daten nach Zeit auf mehrere Tabellen aufzuteilen, eine Tabelle pro Tag. Die Daten für die ursprüngliche 1-Tabelle wurden auf ~ 700 Tabellen aufgeteilt.
Dieses Setup hatte keine Probleme mit dem Einfügen, es dauerte im Laufe der Zeit nicht länger, da für jeden Tag eine neue Tabelle erstellt wurde.
Vakuumprobleme
Wie von i_like_caffeine hervorgehoben, ist der Befehl VACUUM ein Problem, je größer die SQLite-Datei ist. Je mehr Einfügungen / Löschvorgänge durchgeführt werden, desto schlechter wird die Fragmentierung der Datei auf der Festplatte. Daher besteht das Ziel darin, regelmäßig VACUUM zu verwenden, um die Datei zu optimieren und den Dateibereich wiederherzustellen.
Wie aus der Dokumentation hervorgeht , wird jedoch eine vollständige Kopie der Datenbank erstellt, um ein Vakuum zu erzeugen, was sehr lange dauert. Je kleiner die Datenbank ist, desto schneller wird dieser Vorgang abgeschlossen.
Schlussfolgerungen
Für meine spezielle Anwendung werde ich wahrscheinlich Daten auf mehrere Datenbankdateien aufteilen, eine pro Tag, um die Vakuumleistung und die Einfüge- / Löschgeschwindigkeit optimal zu nutzen.
Dies erschwert Abfragen, aber für mich ist es ein lohnender Kompromiss, so viele Daten indizieren zu können. Ein zusätzlicher Vorteil ist, dass ich einfach eine ganze Datenbankdatei löschen kann, um Daten im Wert von einem Tag zu löschen (ein üblicher Vorgang für meine Anwendung).
Ich müsste wahrscheinlich auch die Tabellengröße pro Datei überwachen, um zu sehen, wann die Geschwindigkeit zum Problem wird.
Es ist schade, dass es keine andere inkrementelle Vakuummethode als das automatische Vakuum zu geben scheint . Ich kann es nicht verwenden, da mein Ziel für Vakuum darin besteht, die Datei zu defragmentieren (Dateibereich ist keine große Sache), was beim automatischen Vakuum nicht der Fall ist. Tatsächlich besagt die Dokumentation, dass dies die Fragmentierung verschlimmern kann, sodass ich regelmäßig ein vollständiges Vakuum für die Datei durchführen muss.