Więc zrobiłem kilka testów z sqlite dla bardzo dużych plików i doszedłem do pewnych wniosków (przynajmniej dla mojej konkretnej aplikacji).
Testy obejmują pojedynczy plik sqlite z jedną tabelą lub wieloma tabelami. Każda tabela miała około 8 kolumn, prawie wszystkie liczby całkowite i 4 indeksy.
Pomysł polegał na wstawieniu wystarczającej ilości danych, tak aby pliki sqlite miały rozmiar około 50 GB.
Pojedynczy stół
Próbowałem wstawić wiele wierszy do pliku sqlite za pomocą tylko jednej tabeli. Gdy plik miał około 7 GB (przepraszam, nie mogę sprecyzować liczby wierszy) wstawianie trwało zbyt długo. Oszacowałem, że mój test wstawienia wszystkich moich danych zajmie około 24 godzin, ale nie zakończył się nawet po 48 godzinach.
To prowadzi mnie do wniosku, że pojedyncza, bardzo duża tabela sqlite będzie miała problemy z wstawieniami i prawdopodobnie innymi operacjami.
Myślę, że nie jest to zaskoczeniem, ponieważ tabela się powiększa, wstawianie i aktualizowanie wszystkich indeksów trwa dłużej.
Wiele tabel
Następnie spróbowałem podzielić dane według czasu na kilka tabel, po jednej na dzień. Dane oryginalnej tabeli 1 zostały podzielone na ~ 700 tabel.
Ta konfiguracja nie miała problemów z wstawieniem, nie trwało dłużej w miarę upływu czasu, ponieważ codziennie tworzona była nowa tabela.
Problemy z próżnią
Jak wskazał i_like_caffeine, polecenie VACUUM jest problemem, im większy jest plik sqlite. W miarę wykonywania większej liczby operacji wstawiania / usuwania fragmentacja pliku na dysku będzie się pogarszać, dlatego celem jest okresowe VACUUM w celu optymalizacji pliku i odzyskania przestrzeni plików.
Jednak, jak wskazano w dokumentacji , powstaje pełna kopia bazy danych, aby wykonać próżnię, której wypełnienie zajmuje bardzo dużo czasu. Im mniejsza baza danych, tym szybciej zakończy się ta operacja.
Wnioski
W przypadku mojej konkretnej aplikacji prawdopodobnie podzielę dane na kilka plików db, jeden dziennie, aby uzyskać najlepszą wydajność próżni oraz szybkość wstawiania / usuwania.
To komplikuje zapytania, ale dla mnie warto zaindeksować tyle danych. Dodatkową zaletą jest to, że mogę po prostu usunąć cały plik db, aby upuścić dane o wartości dziennej (częste działanie mojej aplikacji).
Prawdopodobnie musiałbym również monitorować rozmiar tabeli dla pliku, aby zobaczyć, kiedy prędkość stanie się problemem.
Szkoda, że nie wydaje się być metodą przyrostową próżniowe inne niż próżni auto . Nie mogę go użyć, ponieważ moim celem dla próżni jest defragmentacja pliku (przestrzeń plików nie jest wielka sprawa), czego nie robi auto próżnia. W rzeczywistości dokumentacja mówi, że może to pogorszyć fragmentację, dlatego muszę okresowo robić pełną próżnię na pliku.