Saya tahu bahwa sqlite tidak berkinerja baik dengan file database yang sangat besar bahkan ketika mereka didukung (dulu ada komentar di situs sqlite yang menyatakan bahwa jika Anda memerlukan ukuran file di atas 1GB Anda mungkin ingin mempertimbangkan untuk menggunakan rdbms perusahaan. Dapatkah dapat menemukannya lagi, mungkin terkait dengan versi sqlite yang lebih lama).
Namun, untuk tujuan saya, saya ingin mengetahui seberapa buruk sebenarnya sebelum saya mempertimbangkan solusi lain.
Saya berbicara tentang file data sqlite dalam kisaran multi-gigabyte, mulai 2GB dan seterusnya. Adakah yang punya pengalaman dengan ini? Ada tips / ide?
database
performance
sqlite
Snazzer
sumber
sumber
Jawaban:
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.
sumber
Kami menggunakan DBS 50 GB + di platform kami. tidak mengeluh bekerja dengan baik. Pastikan Anda melakukan semuanya dengan benar! Apakah Anda menggunakan pernyataan yang sudah ditentukan sebelumnya? * SQLITE 3.7.3
Terapkan pengaturan ini (tepat setelah Anda membuat DB)
Semoga ini akan membantu orang lain, bekerja dengan baik di sini
sumber
PRAGMA main.temp_store = MEMORY;
.Saya telah membuat basis data SQLite hingga berukuran 3,5GB tanpa masalah kinerja yang nyata. Jika saya ingat dengan benar, saya pikir SQLite2 mungkin memiliki beberapa batasan yang lebih rendah, tetapi saya tidak berpikir SQLite3 memiliki masalah seperti itu.
Menurut halaman Batas SQLite , ukuran maksimum setiap halaman basis data adalah 32 ribu. Dan halaman maksimum dalam database adalah 1024 ^ 3. Jadi menurut hitungan matematis saya yang keluar menjadi 32 terabyte. Saya pikir Anda akan mencapai batas sistem file Anda sebelum mencapai SQLite!
sumber
Sebagian besar alasan yang dibutuhkan> 48 jam untuk melakukan sisipan Anda adalah karena indeks Anda. Ini sangat cepat untuk:
1 - Jatuhkan semua indeks 2 - Lakukan semua sisipan 3 - Buat indeks lagi
sumber
Selain rekomendasi yang biasa:
Saya telah mempelajari yang berikut dari pengalaman saya dengan SQLite3:
Ubah tabel nanti sesuai kebutuhanAnda tidak dapat menambahkan kendala dengan ALTER TABLE).Selamat datang pertanyaan / komentar. ;-)
sumber
Saya pikir keluhan utama tentang penskalaan sqlite adalah:
sumber
Saya memiliki database SQLite 7GB. Untuk melakukan kueri tertentu dengan gabungan dalam dibutuhkan 2,6s Untuk mempercepat ini, saya mencoba menambahkan indeks. Bergantung pada indeks mana yang saya tambahkan, terkadang kueri turun ke 0,1s dan kadang-kadang naik hingga 7s. Saya pikir masalah dalam kasus saya adalah bahwa jika sebuah kolom sangat duplikat maka menambahkan indeks menurunkan kinerja :(
sumber
Dulu ada pernyataan dalam dokumentasi SQLite bahwa batas ukuran praktis dari file database adalah beberapa lusin GB: s. Itu sebagian besar karena perlunya SQLite untuk "mengalokasikan bitmap halaman kotor" setiap kali Anda memulai transaksi. Maka 256 byte RAM diperlukan untuk setiap MB dalam database. Memasukkan file DB 50 GB akan membutuhkan jumlah yang lumayan (2 ^ 8) * (2 ^ 10) = 2 ^ 18 = 256 MB RAM.
Tetapi pada versi terbaru SQLite, ini tidak lagi diperlukan. Baca lebih lanjut di sini .
sumber
2^18
sebenarnya hanya 256 K.Saya mengalami masalah dengan file sqlite besar saat menggunakan perintah vakum.
Saya belum mencoba fitur auto_vacuum. Jika Anda berharap untuk memperbarui dan menghapus data sering maka ini layak dilihat.
sumber