Quindi ho fatto alcuni test con sqlite per file molto grandi e sono giunto ad alcune conclusioni (almeno per la mia specifica applicazione).
I test riguardano un singolo file sqlite con una singola tabella o più tabelle. Ogni tabella aveva circa 8 colonne, quasi tutti numeri interi e 4 indici.
L'idea era quella di inserire dati sufficienti fino a quando i file sqlite erano circa 50 GB.
Tavolo singolo
Ho provato a inserire più righe in un file sqlite con una sola tabella. Quando il file era di circa 7 GB (mi dispiace, non posso essere specifico sui conteggi delle righe), gli inserimenti impiegavano troppo tempo. Avevo stimato che il mio test per inserire tutti i miei dati avrebbe richiesto circa 24 ore, ma non è stato completato nemmeno dopo 48 ore.
Questo mi porta a concludere che una singola tabella sqlite molto grande avrà problemi con gli inserimenti e probabilmente anche altre operazioni.
Immagino che questa non sia una sorpresa, poiché la tabella diventa più grande, l'inserimento e l'aggiornamento di tutti gli indici richiedono più tempo.
Tabelle multiple
Ho quindi provato a dividere i dati per tempo su più tabelle, una tabella al giorno. I dati per la 1 tabella originale sono stati divisi in ~ 700 tabelle.
Questa configurazione non ha avuto problemi con l'inserimento, non ha richiesto più tempo con il passare del tempo, poiché una nuova tabella è stata creata per ogni giorno.
Problemi di vuoto
Come sottolineato da i_like_caffeine, il comando VACUUM è un problema più grande è il file sqlite. Man mano che vengono fatti più inserimenti / eliminazioni, la frammentazione del file su disco peggiorerà, quindi l'obiettivo è periodicamente VACUUM per ottimizzare il file e recuperare spazio sul file.
Tuttavia, come sottolineato dalla documentazione , viene creata una copia completa del database per fare il vuoto, impiegando molto tempo per il completamento. Quindi, più piccolo è il database, più veloce sarà questa operazione.
conclusioni
Per la mia specifica applicazione, probabilmente dividerò i dati su più file db, uno al giorno, per ottenere il meglio sia dalle prestazioni del vuoto che dalla velocità di inserimento / cancellazione.
Ciò complica le query, ma per me è un compromesso utile poter indicizzare questi dati. Un ulteriore vantaggio è che posso semplicemente eliminare un intero file db per eliminare i dati di un giorno (un'operazione comune per la mia applicazione).
Probabilmente dovrei monitorare anche le dimensioni della tabella per file per vedere quando la velocità diventerà un problema.
Peccato che non ci sia un metodo di vuoto incrementale diverso dal vuoto automatico . Non posso usarlo perché il mio obiettivo per il vuoto è di deframmentare il file (lo spazio per i file non è un grosso problema), cosa che il vuoto automatico non fa. In effetti, la documentazione afferma che potrebbe peggiorare la frammentazione, quindi devo ricorrere periodicamente al completo vuoto del file.