Was ist eine realistische, reale und maximale Größe für eine SQLite-Datenbank?

33

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?

Ben Harrison
quelle
3
Ich denke nur, dass wir normalerweise die Anzahl der gleichzeitigen Verbindungen berücksichtigen müssen, da angenommen wird, dass große Datasets häufig von mehreren Benutzern verwendet werden. Es gibt eine Möglichkeit, dies auf Ihrem eigenen System zu testen, nicht wahr?
JeffO
3
Für so etwas wie eine Datenbank mit archivierten Transaktionen, auf die so gut wie nie zugegriffen werden muss, ist SQLite möglicherweise eine gute Wahl, und es wird immer nur einen Benutzer geben (falls vorhanden), und Sie müssen kein Ganzes haben DB-Server-Setup zur Unterstützung. Wenn Sie jedoch mehrere Benutzer gleichzeitig haben, kann es leicht vorkommen, dass Sie Probleme mit dem Sperren bekommen, bevor Sie überhaupt zu einer Datenbank mit mehreren Giganten gelangen.
Michael Kohne
2
@ Pacerier - ja, um die Software zu installieren. Dann müssen Sie DB-Rollen zuweisen, herausfinden, wie Sie sich in Ihr Backup-System integrieren können, und sicherstellen, dass das Backup-System den DB-Server zu Beginn und am Ende von Backups usw. in den richtigen Zustand versetzt. Es gibt noch viel mehr zu tun Einrichten eines DB-Servers als nur die Installation der Software. Darüber hinaus ist es ein weiterer Dienst, über den Sie sich vom Standpunkt der Netzwerksicherheit aus Sorgen machen müssen, und ein weiterer, den Sie mit dem Patchen auf dem Laufenden halten müssen. Wenn Sie einen db-Dienst benötigen, auf jeden Fall, aber Sie brauchen ihn nicht, hat SQLite eine Menge weniger Overhead.
Michael Kohne
1
@ leeand00 - Oder Sie könnten einen Monat lang Platz mieten.
JeffO

Antworten:

26

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.). .)

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

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 .sqliteDatei, 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 TRANSACTIONWenn 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 .sqliteDatenbankdateien zwar als "portabel" dokumentiert ist, ich es jedoch sehr bevorzuge, Datenbanken im SQL- Textformat (unter Verwendung von sqlite3 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.

Basile Starynkevitch
quelle
7
Sie hätten nach dem vierten Absatz aufhören können zu schreiben. Aber trotzdem +1.
Robert Harvey
3
Vielleicht, aber ich war unangenehm überrascht zu bemerken, dass selbst bei einer neuen SQLite-Datenbank von nur wenigen Megabyte Transaktionen in der Praxis so wichtig sind (mit nur einem einzigen Prozess wird auf diese neue Datei zugegriffen, tatsächlich geschrieben).
Basile Starynkevitch
3
Das gilt sicherlich für Schreibvorgänge. In der Praxis ist eine SQLite-Datenbank mit Größen, wie sie im OP beschrieben werden, kaum vorstellbar. Postgresql wäre wahrscheinlich eine bessere Wahl, nicht wegen seiner Größenfähigkeiten, sondern wegen der industriellen Parallelität, die SQLite nicht hat.
Robert Harvey
5
Es gibt viele legitime Situationen, in denen Sie SQLite-Datenbanken mit großen Dateigrößen haben könnten. Von den SQLite-Entwicklern selbst: Betrachten Sie es weniger als Ersatz für MySql als vielmehr als Ersatz für fopen. Das Schreiben von 3D-CAD-Software und die Verwendung von SQLite-Datenbanken zum Speichern von Daten über Objekte kann durchaus sinnvoll sein.
Whatsisname
2
@ Pacerier: Filmdateien und ähnliche Binärblobs werden normalerweise nicht in der Datenbank gespeichert. Sie werden im Dateisystem gespeichert, und Links zu ihnen werden in der Datenbank gespeichert.
Robert Harvey