Así que hice algunas pruebas con sqlite para archivos muy grandes y llegué a algunas conclusiones (al menos para mi aplicación específica).
Las pruebas implican un único archivo sqlite con una sola tabla o varias tablas. Cada tabla tenía aproximadamente 8 columnas, casi todos enteros, y 4 índices.
La idea era insertar suficientes datos hasta que los archivos sqlite tuvieran aproximadamente 50 GB.
Mesa individual
Traté de insertar varias filas en un archivo sqlite con solo una tabla. Cuando el archivo tenía aproximadamente 7 GB (lo siento, no puedo ser específico sobre el recuento de filas) las inserciones tardaban demasiado. Había estimado que mi prueba para insertar todos mis datos tardaría aproximadamente 24 horas, pero no se completó incluso después de 48 horas.
Esto me lleva a concluir que una sola tabla sqlite muy grande tendrá problemas con las inserciones, y probablemente también con otras operaciones.
Supongo que esto no es una sorpresa, ya que la tabla se hace más grande, la inserción y actualización de todos los índices lleva más tiempo.
Tablas Múltiples
Luego intenté dividir los datos por tiempo en varias tablas, una tabla por día. Los datos para la tabla 1 original se dividieron en ~ 700 tablas.
Esta configuración no tuvo problemas con la inserción, no tardó más a medida que avanzaba el tiempo, ya que se creó una nueva tabla para cada día.
Problemas de vacío
Como lo señaló i_like_caffeine, el comando VACUUM es un problema cuanto más grande es el archivo sqlite. A medida que se realizan más inserciones / eliminaciones, la fragmentación del archivo en el disco empeorará, por lo que el objetivo es VACÍO periódicamente para optimizar el archivo y recuperar el espacio de archivo.
Sin embargo, como se señala en la documentación , se realiza una copia completa de la base de datos para hacer un vacío, lo que lleva mucho tiempo completarla. Por lo tanto, cuanto más pequeña sea la base de datos, más rápida será esta operación.
Conclusiones
Para mi aplicación específica, probablemente dividiré los datos en varios archivos db, uno por día, para obtener el mejor rendimiento de vacío y la velocidad de inserción / eliminación.
Esto complica las consultas, pero para mí, es una compensación valiosa poder indexar esta cantidad de datos. Una ventaja adicional es que solo puedo eliminar un archivo db completo para eliminar el valor de un día de datos (una operación común para mi aplicación).
Probablemente también tenga que monitorear el tamaño de la tabla por archivo para ver cuándo la velocidad se convertirá en un problema.
Es una pena que no parece haber un método de vacío incremental que no sea el vacío automático . No puedo usarlo porque mi objetivo para el vacío es desfragmentar el archivo (el espacio de archivo no es un gran problema), lo que el vacío automático no hace. De hecho, la documentación indica que puede empeorar la fragmentación, por lo que tengo que recurrir a hacer un vacío completo en el archivo periódicamente.