Bu yüzden çok büyük dosyalar için sqlite ile bazı testler yaptım ve bazı sonuçlara vardım (en azından benim özel uygulama için).
Testler, tek bir tablo veya birden çok tablo içeren tek bir sqlite dosyası içerir. Her tabloda yaklaşık 8 sütun, neredeyse tüm tamsayılar ve 4 dizin vardı.
Fikir, sqlite dosyaları yaklaşık 50GB olana kadar yeterli veri eklemekti.
Tekli Masa
Sadece bir tablo ile bir sqlite dosyasına birden çok satır eklemeye çalıştım. Dosya yaklaşık 7GB olduğunda (üzgünüm satır sayıları hakkında kesin olamıyorum) eklemeler çok uzun sürüyordu. Tüm verilerimi ekleme testimin 24 saat kadar süreceğini tahmin etmiştim, ancak 48 saat sonra bile tamamlanmadı.
Bu beni tek, çok büyük bir sqlite tablosunun eklemeler ve muhtemelen diğer işlemler ile ilgili sorunları olacağı sonucuna götürüyor.
Sanırım bu sürpriz değil, tablo büyüdükçe, tüm endekslerin eklenmesi ve güncellenmesi daha uzun sürüyor.
Çoklu Tablolar
Sonra günde bir tablo, birkaç tablo üzerinde zamana göre veri bölme çalıştı. Orijinal 1 tablosu için veriler ~ 700 tabloya bölünmüştür.
Bu kurulumun ekleme ile ilgili bir sorunu yoktu, her gün için yeni bir tablo oluşturulduğundan zaman ilerledikçe daha uzun sürmedi.
Vakum Sorunları
İ_like_caffeine tarafından belirtildiği gibi, VACUUM komutu sqlite dosyası büyüdükçe bir sorundur. Daha fazla ekleme / silme işlemi yapıldıkça, dosyanın diskteki parçalanması daha da kötüleşecektir, bu nedenle amaç dosyayı optimize etmek ve dosya alanını kurtarmak için periyodik olarak VACUUM'dur.
Bununla birlikte, belgelerin işaret ettiği gibi , vakumun tamamlanması için çok uzun zaman alan bir veritabanının tam bir kopyası yapılır. Yani, veritabanı ne kadar küçük olursa, bu işlem o kadar hızlı biter.
Sonuçlar
Özel uygulama için, muhtemelen vakum performansı ve ekleme / silme hızından en iyi şekilde yararlanmak için verileri günde bir tane olmak üzere birkaç db dosyası üzerinde bölerim.
Bu, sorguları karmaşıklaştırır, ancak benim için, bu kadar veriyi endeksleyebilmeye değer bir ödünleşim. Ek bir avantaj, sadece bir günlük değer veri (benim uygulama için ortak bir işlem) bırakmak için tüm bir db dosyasını silebilirsiniz.
Muhtemelen hızın ne zaman sorun haline geleceğini görmek için dosya başına tablo boyutunu izlemem gerekir.
Otomatik vakum dışında artımlı bir vakum yöntemi olmadığı çok kötü . Bunu kullanamıyorum çünkü vakum için hedefim, otomatik vakumun yapmadığı dosyayı (dosya alanı büyük bir anlaşma değil) birleştirmektir. Aslında, belgeler parçalanmayı daha da kötüleştirebileceğini belirtiyor, bu yüzden düzenli olarak dosyada tam bir vakum yapmak zorunda kalıyorum.