Então fiz alguns testes com o sqlite para arquivos muito grandes e cheguei a algumas conclusões (pelo menos para minha aplicação específica).
Os testes envolvem um único arquivo sqlite com uma única tabela ou várias tabelas. Cada tabela tinha cerca de 8 colunas, quase todos os números inteiros e 4 índices.
A idéia era inserir dados suficientes até que os arquivos sqlite tivessem cerca de 50 GB.
Mesa Única
Tentei inserir várias linhas em um arquivo sqlite com apenas uma tabela. Quando o arquivo tinha cerca de 7 GB (desculpe, não posso ser específico sobre a contagem de linhas), as inserções estavam demorando muito. Eu havia estimado que meu teste para inserir todos os meus dados levaria 24 horas ou mais, mas não foi concluído mesmo após 48 horas.
Isso me leva a concluir que uma única tabela sqlite muito grande terá problemas com inserções e provavelmente outras operações também.
Acho que isso não é surpresa, pois a tabela fica maior, a inserção e a atualização de todos os índices levam mais tempo.
Tabelas Múltiplas
Tentei dividir os dados por tempo em várias tabelas, uma tabela por dia. Os dados da tabela 1 original foram divididos em ~ 700 tabelas.
Essa configuração não teve problemas com a inserção, não demorou mais com o passar do tempo, pois uma nova tabela era criada para todos os dias.
Questões de vácuo
Conforme apontado por i_like_caffeine, o comando VACUUM é um problema, quanto maior o arquivo sqlite. À medida que mais inserções / exclusões são feitas, a fragmentação do arquivo no disco fica pior, portanto, o objetivo é periodicamente VACUUM para otimizar o arquivo e recuperar o espaço no arquivo.
No entanto, como indicado na documentação , é feita uma cópia completa do banco de dados para fazer um vácuo, levando muito tempo para ser concluída. Portanto, quanto menor o banco de dados, mais rápida será a conclusão dessa operação.
Conclusões
Para meu aplicativo específico, provavelmente estarei dividindo dados em vários arquivos db, um por dia, para obter o melhor desempenho de vácuo e velocidade de inserção / exclusão.
Isso complica as consultas, mas, para mim, é uma compensação valiosa poder indexar tantos dados. Uma vantagem adicional é que eu posso excluir um arquivo db inteiro para descartar os dados de um dia (uma operação comum para o meu aplicativo).
Eu provavelmente teria que monitorar o tamanho da tabela por arquivo também para ver quando a velocidade se tornará um problema.
É uma pena que não pareça haver um método de vácuo incremental que não seja o vácuo automático . Não posso usá-lo porque meu objetivo para o vácuo é desfragmentar o arquivo (o espaço no arquivo não é grande coisa), o que o vácuo automático não faz. De fato, a documentação afirma que isso pode piorar a fragmentação, por isso tenho que recorrer periodicamente a um vácuo total no arquivo.