Jadi saya melakukan beberapa tes dengan sqlite untuk file yang sangat besar, dan sampai pada beberapa kesimpulan (setidaknya untuk aplikasi spesifik saya).
Pengujian melibatkan file sqlite tunggal dengan tabel tunggal, atau beberapa tabel. Setiap tabel memiliki sekitar 8 kolom, hampir semua bilangan bulat, dan 4 indeks.
Idenya adalah untuk memasukkan data yang cukup sampai file sqlite sekitar 50GB.
Meja Tunggal
Saya mencoba memasukkan beberapa baris ke dalam file sqlite hanya dengan satu tabel. Ketika file sekitar 7GB (maaf saya tidak bisa spesifik tentang jumlah baris) penyisipan terlalu lama. Saya memperkirakan bahwa pengujian saya untuk memasukkan semua data saya akan memakan waktu 24 jam atau lebih, tetapi tidak lengkap bahkan setelah 48 jam.
Ini membuat saya menyimpulkan bahwa tabel sqlite tunggal yang sangat besar akan memiliki masalah dengan penyisipan, dan mungkin juga operasi lainnya.
Saya kira ini bukan kejutan, karena tabel semakin besar, memasukkan dan memperbarui semua indeks membutuhkan waktu lebih lama.
Beberapa Tabel
Saya kemudian mencoba membagi data berdasarkan waktu pada beberapa tabel, satu tabel per hari. Data untuk 1 tabel asli dipecah menjadi ~ 700 tabel.
Pengaturan ini tidak memiliki masalah dengan penyisipan, tidak butuh waktu lebih lama seiring berjalannya waktu, karena tabel baru dibuat untuk setiap hari.
Masalah Vakum
Seperti yang ditunjukkan oleh i_like_caffeine, perintah VACUUM adalah masalah semakin besar file sqlite. Karena semakin banyak sisipan / penghapusan yang dilakukan, fragmentasi file pada disk akan semakin buruk, sehingga tujuannya adalah secara berkala VACUUM untuk mengoptimalkan file dan memulihkan ruang file.
Namun, sebagaimana ditunjukkan oleh dokumentasi , salinan lengkap dari database dibuat untuk melakukan kekosongan, membutuhkan waktu yang sangat lama untuk diselesaikan. Jadi, semakin kecil basis datanya, semakin cepat operasi ini akan selesai.
Kesimpulan
Untuk aplikasi spesifik saya, saya mungkin akan membagi data lebih dari beberapa file db, satu per hari, untuk mendapatkan yang terbaik dari kinerja vakum dan kecepatan penyisipan / penghapusan.
Ini menyulitkan pertanyaan, tetapi bagi saya, itu tradeoff yang bermanfaat untuk dapat mengindeks data sebanyak ini. Keuntungan tambahan adalah saya bisa menghapus seluruh file db untuk menjatuhkan data sehari (operasi umum untuk aplikasi saya).
Saya mungkin harus memantau ukuran tabel per file juga untuk melihat kapan kecepatan akan menjadi masalah.
Sayang sekali sepertinya tidak ada metode vakum tambahan selain vakum otomatis . Saya tidak dapat menggunakannya karena tujuan saya untuk vakum adalah untuk mendefrag file (ruang file bukan masalah besar), yang vakum otomatis tidak lakukan. Faktanya, dokumentasi menyatakan ini dapat memperburuk fragmentasi, jadi saya harus menggunakan vakum penuh pada file secara berkala.