Che cos'è una dimensione massima realistica, reale, per un database SQLite?

25

Secondo questo articolo su Usi appropriati per SQLite si dice che, mentre SQLite è limitato a 140 terabyte , un RDBMS client / server può funzionare meglio:

An SQLite database is limited in size to 140 terabytes (247 bytes, 128 tibibytes). And even if it could handle larger databases, SQLite stores the entire database in a single disk file and many filesystems limit the maximum size of files to something less than this. So if you are contemplating databases of this magnitude, you would do well to consider using a client/server database engine that spreads its content across multiple disk files, and perhaps across multiple volumes.

In generale, sono d'accordo con questo, ma sono stato sorpreso di apprendere che il limite massimo di SQLite era così alto! Nella mia esperienza ho usato un bel po 'di database SQL Server nella dimensione di ~ 30-100 GB. Ho anche lavorato indirettamente con database molto più grandi utilizzando Oracle, Postgres o Cassandra. Di quelli, almeno per quanto ne so, nessuno si stava avvicinando a 140 TB. Non sono un DBA, quindi questo è ciò che considererei "grande" dalla mia esperienza diretta.

Ho preso in considerazione solo SQLite per le situazioni in cui il database sarebbe minuscolo; al massimo dozzine di megabyte.

Dopo aver letto questo articolo non sono ancora convinto di prendere in considerazione SQLite per tutto ciò che potrebbe richiedere centinaia di gigabyte. Ma mi chiedo se ho sottovalutato le sue capacità. Qual è un limite di dimensioni massime realistiche per un database SQLite in uso nel mondo reale?

    
posta Ben Harrison 26.09.2016 - 15:47
fonte

1 risposta

19

Il limite realistico (della dimensione di alcuni database Sqlite) è lo stesso del limite realistico per un file di dati. E quel limite dipende molto dal tuo computer e amp; sistema. Sul mio attuale desktop Linux non posso permettermi molto più di un file 350Gbyte (perché come regola generale evito di avere un singolo file che mangia più di metà di una partizione del disco). A proposito, questo limite pratico influisce anche su altri RDBMS SQL come PostGreSQL o MariaDB (ma la maggior parte di questi tiene i dati in diversi file, che è possibile mantenere su diversi file system, e alcuni di essi sono in grado di gestirli dati distribuiti su macchine remote ...)

After reading this article I'm still not convinced to ever consider SQLite for anything that might require hundreds of gigabytes

Hai ragione e torto.

Hai ragione, perché sul computer di oggi (laptop e desktop, non supercomputer o server datacenter), un centinaio di gigabyte è ancora uno spazio su disco abbastanza grande. Quindi, in pratica, se si pensa a un database così grande, è meglio immaginare un vero server SQL (à la PostGreSQL), in particolare perché si potrebbe desiderare molto probabilmente un accesso remoto, un accesso effettivamente concorrente e probabilmente dati distribuiti e amp; tabelle.

Tu sei (in linea di principio, non ho mai provato) sbagliato perché molto probabilmente SQLite è in grado (e talvolta testato) di gestire un database di diverse centinaia di gigabyte, assumendo che tu abbia un filesystem in grado di gestire un file così grande (e probabilmente due di loro almeno).

Sicuramente (a volte) considero SQLite per database di diverse dozzine di gigabyte (e ho provato una volta un file .sqlite di grandi dimensioni, IIRC di 40Gbytes). Sulle attuali macchine (non supercomputer), esiterei con centinaia di gigabyte di database SQLite, semplicemente perché un tale file è abbastanza grande per la pratica odierna.

IIRC un fornitore di hardware che vendeva macchine per filesystem specializzati mi ha parlato di un'applicazione sqlite di un terabyte (ma potrei sbagliarmi).

Ovviamente le prestazioni SQLite dipendono (come tutti i database SQL) molto del numero e della larghezza delle tabelle, dei loro indici, delle query SQL coinvolte. E tu non vuoi avere accesso simultaneo (da molti processi diversi), e dovresti usare la transazione (per esperienza, anche su un piccolo database SQLITE di pochi megabyte, vuoi davvero racchiudere le tue es. Migliaia di richieste di inserimento con BEGIN TRANSACTION & END TRANSACTION , non farlo sta rallentando Sqlite di un grande fattore -più di 10x -).

E per esperienza personale, con configurazione e organizzazione adeguate, SQLite è in grado di gestire un database più grande della RAM disponibile (quindi 30Gbyte non è un problema) - ma probabilmente vorrai che gli indici si adattino alla RAM!

Se ti capita di codificare qualcosa per un "supercomputer" o una costosa workstation (con ad esempio 512 GB di RAM e 8 TB di disco e 512 GB di SSD), puoi sicuramente disporre di un database Sqlite di terabyte. Ma vorrai farlo forse solo se uno (o pochissimi) processi sta accedendo a quel database. Se hai una dozzina di processi che accedono contemporaneamente allo stesso database, installa meglio un vero RDBMS SQL (alla MariaDB o PostGreSQL)

Si noti inoltre che mentre il formato (binario) dei file di database .sqlite è documentato come "portatile", ho molto preferire il backup dei database nel formato SQL testuale (utilizzando sqlite3 mydb.sqlite .dump > mydb.sql ). Quindi, ho anche bisogno di spazio aggiuntivo su disco per quel dump testuale (e questo riduce il limite realistico).

Solitamente Sqlite non è il collo di bottiglia. Ma il disco potrebbe essere.

PS. Lo stesso ragionamento potrebbe essere applicato a file indicizzati di grandi dimensioni utilizzando GDBM .

PPS. Nella mia expjs filiale (sept.2016) del mio monitor MELT (software gratuito GPLv3, su github ) Sono persistente l'intero heap dell'applicazione in JSON all'interno di un nuovo database Sqlite. Ho eseguito piccoli esperimenti con diversi milioni di oggetti (abbastanza "grandi") senza brutte sorprese. YMMV.

    
risposta data 26.09.2016 - 15:58
fonte

Leggi altre domande sui tag