SQLite: 35% Lebih Cepat daripada Sistem File
(sqlite.org)- SQLite dapat membaca dan menulis Blob kecil (misalnya gambar thumbnail) 35% lebih cepat daripada membaca atau menulisnya sebagai file terpisah dengan
fread()ataufwrite() - Selain itu, satu basis data SQLite yang menyimpan Blob 10KB menggunakan ruang disk sekitar 20% lebih sedikit dibanding menyimpan Blob sebagai file terpisah
- Perbedaan performa tampaknya terjadi karena saat bekerja dengan basis data SQLite, pemanggilan sistem
open()danclose()hanya dilakukan sekali, sedangkan saat menggunakan Blob dalam file terpisah,open()danclose()dipanggil sekali untuk setiap Blob. Overheadopen()danclose()tampaknya lebih besar daripada overhead penggunaan basis data - Pengurangan ukuran terjadi karena file terpisah diisi hingga kelipatan berikutnya dari ukuran blok sistem file, sedangkan Blob dapat dikemas lebih rapat di dalam basis data SQLite
Hal yang perlu diperhatikan
- Angka 35% adalah nilai perkiraan. Waktu aktual bervariasi tergantung pada perangkat keras, sistem operasi, dan detail eksperimen, serta ada variasi performa acak pada perangkat keras nyata
- Angka 35% berasal dari hasil pengujian pada semua sistem yang mudah diakses oleh penulis. Beberapa peninjau melaporkan bahwa pada sistem mereka SQLite memiliki latensi lebih tinggi daripada I/O langsung. Perbedaan itu masih belum dipahami
- SQLite tampaknya tidak bekerja sebaik I/O langsung saat eksperimen dijalankan dengan cache sistem file yang dingin
- Dokumen ini membantah asumsi umum bahwa basis data relasional seharusnya lebih lambat daripada I/O sistem file secara langsung
- Menurut riset tahun 2022, dalam beban kerja nyata SQLite kira-kira 2 kali lebih cepat dibanding Btrfs dan Ext4 di Linux
Cara pengukuran
- Performa I/O diukur menggunakan program
kvtest.cdalam source tree SQLite - Untuk mengompilasi program uji ini, kumpulkan file sumber
kvtest.cke dalam direktori bersama file sumber amalgamasi SQLite"sqlite3.c"dan"sqlite3.h", lalu jalankan perintah yang mirip dengan berikut di Unix - Program
"kvtest"yang dihasilkan dari perintah ini digunakan untuk membuat basis data uji yang terdiri dari 100.000 Blob acak tak terkompresi, dengan ukuran tiap Blob antara 8.000 byte dan 12.000 byte - Untuk membuat salinan semua Blob sebagai file terpisah dalam direktori, Anda dapat menjalankan perintah
"export"menggunakan opsi command line--tree - Perintah berikut digunakan untuk mengukur performa membaca Blob dari basis data dan membaca Blob dari file terpisah
- Dengan opsi
--blob-api, SQLite dapat memuat isi Blob menggunakan fungsisqlite3_blob_read()alih-alih menjalankan pernyataan SQL, sehingga berjalan sedikit lebih cepat pada uji baca
Pengukuran performa baca
- Di Windows10, konten dapat dibaca dari basis data SQLite sekitar 5 kali lebih cepat daripada membacanya langsung dari disk
- Di Android, SQLite sekitar 35% lebih cepat daripada membaca dari disk
- Saat membaca dari basis data yang dimemory-map menggunakan
sqlite3_blob_read(), di Mac dan Android hasilnya 2 kali lebih cepat daripada membaca file terpisah dari disk, dan di Windows 10 kali lebih cepat
Pengukuran performa tulis
- Pada semua sistem, baik I/O langsung maupun SQLite, performa tulis 5 hingga 15 kali lebih lambat daripada baca
- Dalam uji tulis, perangkat lunak antivirus hampir tidak memengaruhi penulisan SQLite, tetapi penulisan langsung ke disk menjadi sekitar 10 kali lebih lambat
- Ini kemungkinan karena SQLite hanya mengubah satu file basis data, sedangkan perubahan langsung ke disk mengubah ribuan file terpisah yang harus diperiksa antivirus
Hasil umum
- SQLite kompetitif dengan Blob yang disimpan dalam file disk terpisah untuk baca maupun tulis, dan biasanya lebih cepat
- SQLite jauh lebih cepat daripada penulisan langsung ke disk di Windows saat perlindungan antivirus aktif
- Pembacaan sekitar 10 kali lebih cepat daripada penulisan pada semua sistem, baik di SQLite maupun I/O disk langsung
- Performa I/O sangat bervariasi tergantung sistem operasi dan perangkat keras. Pengukuran sendiri diperlukan sebelum menarik kesimpulan
- Beberapa mesin basis data SQL lain menyarankan pengembang untuk menyimpan Blob dalam file terpisah lalu menyimpan nama file di basis data. Dalam kasus ini, menyimpan seluruh Blob di basis data memberikan performa baca dan tulis yang jauh lebih cepat di SQLite
Pendapat GN⁺
- Sangat menarik bahwa performa SQLite lebih baik daripada membaca dan menulis file terpisah. Ini tampaknya dapat membantu meningkatkan performa aplikasi yang menggunakan basis data
- Namun, hasil benchmark ini tidak serta-merta berlaku umum untuk semua situasi. Hasil dapat berbeda tergantung karakteristik data, pola akses, konfigurasi perangkat keras, dan lain-lain. Untuk aplikasi penting, benchmark dengan beban kerja nyata tetap penting
- SQLite juga memiliki keunggulan karena dapat menghindari pemindaian antivirus. Ini akan sangat berguna khususnya untuk aplikasi yang menangani banyak file kecil
- Kekurangan SQLite adalah semua data disimpan dalam satu file, sehingga jika file basis data rusak, seluruh data bisa hilang. Karena itu penting untuk mencadangkan file basis data secara berkala
4 komentar
Kalau akses ke atribut file (nama file, ukuran, izin akses, …) juga ikut dimasukkan ke dalam basis data,
kalau tidak begitu, bukankah seharusnya yang dibandingkan itu I/O blok, bukan I/O file…
Bagaimanapun juga, SQLite memang cepat.
Komentar Hacker News
Karena tidak ada atribut atau metadata sistem file, tidak perlu pencatatan atau pembaruan atribut tambahan, dan tidak ada pemeriksaan file fisik atau pipe/symbolic link, pemeriksaan izin, atau ketidakcocokan penyelarasan ukuran blok, sehingga hanya memerlukan satu perintah open
Peningkatan kecepatan 4 kali di Windows 10 menegaskan betapa lambatnya system call file system Windows
Ada ide untuk merekam semua not yang keluar dari piano digital secara real time
Menarik membandingkannya dengan riset OS dari sudut pandang laboratorium riset basis data
Sedang mempertimbangkan untuk menambahkan data ke DB sqlite dalam mode WAL2
Di basis data SQLite, system call open() dan close() hanya dipanggil satu kali
Menyimpan file menggunakan field blob SQLite tidak direkomendasikan
Fakta bahwa sesuatu yang dibangun di atas sistem file lebih cepat daripada sistem file berarti sistem file lambat saat digunakan dengan cara yang tidak dioptimalkan
Menghapus banyak baris di basis data SQLite lebih lambat daripada menghapus file
Semua akses ke sistem file/drive dikelola oleh OS
20 tahun lalu, arsitektur memasukkan file sebagai blob ke Oracle DB digunakan dengan baik.. tetapi setiap kali harus menjelaskan kelebihannya kepada orang-orang. Tentu saja, tidak selalu berhasil setiap kali.
Kalau 20 tahun lalu, harga SAN DISK Oracle pasti tidak murah..