In diesem Artikel über geeignete Verwendungen für SQLite heißt es, dass SQLite zwar auf 140 Terabyte beschränkt ist , ein Client / Server-RDBMS jedoch möglicherweise besser funktioniert:
Eine SQLite-Datenbank ist auf 140 Terabyte (2 47 Byte, 128 Tibibyte) begrenzt. Und selbst wenn es größere Datenbanken handhaben könnte, speichert SQLite die gesamte Datenbank in einer einzigen Festplattendatei, und viele Dateisysteme begrenzen die maximale Größe von Dateien auf etwas weniger. Wenn Sie also Datenbanken dieser Größenordnung in Betracht ziehen, sollten Sie in Betracht ziehen, ein Client / Server-Datenbankmodul zu verwenden, das seinen Inhalt auf mehrere Festplattendateien und möglicherweise auf mehrere Volumes verteilt.
Im Allgemeinen stimme ich dem zu, aber ich war überrascht zu erfahren, dass die Höchstgrenze von SQLite so hoch war! Nach meiner Erfahrung habe ich einige SQL Server-Datenbanken mit einer Größe von ~ 30-100 GB verwendet. Ich habe auch indirekt mit viel größeren Datenbanken mit Oracle, Postgres oder Cassandra gearbeitet. Zumindest meines Wissens näherte sich keiner von ihnen 140 TB. Ich bin kein DBA, daher würde ich dies aus meiner direkten Erfahrung als "groß" bezeichnen.
Ich habe SQLite nur für Situationen in Betracht gezogen, in denen die Datenbank winzig wäre. höchstens Dutzende von Megabyte.
Nach dem Lesen dieses Artikels bin ich immer noch nicht davon überzeugt, SQLite für irgendetwas in Betracht zu ziehen, das Hunderte von Gigabyte erfordern könnte. Aber ich frage mich, ob ich seine Fähigkeiten unterschätzt habe. Was ist eine realistische maximale Größenbeschränkung für eine SQLite-Datenbank in der Praxis?
quelle
Antworten:
Das realistische Limit (der Größe einiger SQLite-Datenbanken) entspricht dem realistischen Limit für eine Datendatei. Und diese Grenze hängt stark von Ihrem Computer und Ihrem System ab. Auf meinem aktuellen Linux-Desktop kann ich mir nicht viel mehr als eine 350-GB-Datei leisten (da ich als Faustregel vermeide, dass eine einzelne Datei mehr als eine halbe Festplattenpartition belegt). Übrigens wirkt sich diese praktische Beschränkung auch auf andere SQL-RDBMS wie PostGreSQL oder MariaDB aus (die meisten dieser Datenbanken speichern jedoch Daten in mehreren Dateien, die möglicherweise auf verschiedenen Dateisystemen gespeichert sind, und einige von ihnen können verteilte Daten auf Remotecomputern verwalten.). .)
Sie haben Recht und Unrecht.
Sie haben Recht, denn auf heutigen Computern (Laptops und Desktops, keine Supercomputer oder Rechenzentrums-Server) sind immer noch hundert Gigabyte ein recht großer Speicherplatz. Wenn Sie also an eine so große Datenbank denken, sollten Sie sich in der Praxis einen echten SQL-Server (à la PostGreSQL) vorstellen, da Sie sehr wahrscheinlich Remotezugriff, effektiv gleichzeitigen Zugriff und wahrscheinlich verteilte Daten und Tabellen wünschen.
Sie haben (im Prinzip, ich habe es nie versucht) Unrecht, weil SQLite sehr wahrscheinlich in der Lage (und manchmal auch getestet) ist, mit einer Datenbank von mehreren hundert Gigabyte umzugehen, vorausgesetzt, Sie haben ein Dateisystem, das mit einer so großen Datei (und wahrscheinlich zwei von zwei) umgehen kann sie zumindest).
Ich würde sicherlich (manchmal) SQLite für Datenbanken von mehreren Dutzend Gigabyte in Betracht ziehen (und ich habe einmal eine so große
.sqlite
Datei, IIRC von 40 GByte, ausprobiert). Auf aktuellen (Nicht-Supercomputer-) Computern würde ich zögern, viele hundert Gigabyte SQLite-Datenbank zu haben, einfach weil eine solche Datei nach heutiger Praxis ziemlich groß ist.IIRC Einige Hardwarehersteller, die spezialisierte Dateisystemmaschinen verkauften, sprachen mich einmal von einer Terabyte-SQLite-Anwendung an (aber ich könnte mich irren).
Natürlich hängt die SQLite-Leistung (wie alle SQL-Datenbanken) stark von der Anzahl und Breite der Tabellen, ihren Indizes und den damit verbundenen SQL-Abfragen ab. Und Sie möchten keinen gleichzeitigen Zugriff (durch viele verschiedene Prozesse) haben, und Sie sollten die Transaktion (aus Erfahrung, auch bei einer winzigen SQLITE-Datenbank von wenigen Megabyte) verwenden, um Ihre z. B. tausend Einfügeanforderungen wirklich mit
BEGIN TRANSACTION
& zu verpacken.END TRANSACTION
Wenn Sie dies nicht tun, verlangsamt sich Sqlite um einen großen Faktor (mehr als das 10-fache).Und nach persönlicher Erfahrung kann SQLite bei geeigneter Konfiguration und Organisation eine Datenbank verwalten, die größer als der verfügbare Arbeitsspeicher ist (30 GB sind also kein Problem) - aber Sie möchten wahrscheinlich, dass die Indizes in den Arbeitsspeicher passen!
Wenn Sie etwas für einen "Supercomputer" oder eine teure Workstation codieren (z. B. mit 512 GB RAM und 8 TB Festplatte und 512 GB SSD), können Sie sicher eine Terabyte-SQLite-Datenbank haben. Aber Sie werden das vielleicht nur tun wollen, wenn ein (oder sehr wenige) Prozesse auf diese Datenbank zugreifen. Wenn Sie über ein Dutzend Prozesse verfügen, die gleichzeitig auf dieselbe Datenbank zugreifen, sollten Sie ein echtes SQL-RDBMS (à la MariaDB oder PostGreSQL) installieren.
Beachten Sie auch, dass das (Binär-) Format von
.sqlite
Datenbankdateien zwar als "portabel" dokumentiert ist, ich es jedoch sehr bevorzuge, Datenbanken im SQL- Textformat (unter Verwendung vonsqlite3 mydb.sqlite .dump > mydb.sql
) zu sichern . Dann brauche ich auch zusätzlichen Speicherplatz für diesen Text-Dump (und das senkt die realistische Grenze).Normalerweise ist SQLite nicht der Engpass. Aber die Scheibe könnte sein.
PS. Dieselbe Überlegung könnte mit GDBM auf große indizierte Dateien angewendet werden .
PPS. In meinem expjs Zweig (sept.2016) meinem MELT - Monitor (GPLv3 freier Software, auf Github) Ich persistierenden das gesamte Application - Heap in JSON in einer frischen SQLite - Datenbank. Ich habe winzige Experimente mit mehreren Millionen Objekten (ziemlich "groß") ohne böse Überraschungen durchgeführt. YMMV.
quelle