15 poin oleh GN⁺ 2024-07-28 | 4 komentar | Bagikan ke WhatsApp
  • SQLite dapat membaca dan menulis Blob kecil (misalnya gambar thumbnail) 35% lebih cepat daripada membaca atau menulisnya sebagai file terpisah dengan fread() atau fwrite()
  • 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() dan close() hanya dilakukan sekali, sedangkan saat menggunakan Blob dalam file terpisah, open() dan close() dipanggil sekali untuk setiap Blob. Overhead open() dan close() 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.c dalam source tree SQLite
  • Untuk mengompilasi program uji ini, kumpulkan file sumber kvtest.c ke 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 fungsi sqlite3_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

 
iolothebard 2024-07-28

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.

 
GN⁺ 2024-07-28
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

    • Ini masuk akal jika Anda mengorbankan fitur dan mengabaikan desain serbaguna
    • Jika menggunakan pemetaan FUSE untuk SQLite dan mengaksesnya dengan me-mount direktori, performanya bisa serupa atau bahkan lebih lambat
    • Jika atribut dinonaktifkan dan dibuat sistem file kustom dengan ukuran blok yang dioptimalkan, performa serupa bisa dicapai
    • Ada kesederhanaan karena file dapat dijelajahi dan dimanipulasi menggunakan perintah shell seperti rsync
    • SQLite cocok untuk aset statis yang dipaketkan atau aplikasi tipe appliance
  • 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

    • Menggunakan SQLite untuk menyimpannya sebagai tabel tunggal, dengan setiap baris merupakan event MIDI piano
    • Performanya baik dan dapat dianalisis nanti
  • Menarik membandingkannya dengan riset OS dari sudut pandang laboratorium riset basis data

    • Basis data relasional dioptimalkan untuk record individual kecil dan konsistensi
    • Semakin besar ukuran baris, performanya turun drastis
  • Sedang mempertimbangkan untuk menambahkan data ke DB sqlite dalam mode WAL2

    • Hampir tidak ada penalti performa tulis dan ada keuntungan besar untuk baca/analisis
  • Di basis data SQLite, system call open() dan close() hanya dipanggil satu kali

    • Overhead-nya lebih kecil dibanding memakai blob di file individual
  • Menyimpan file menggunakan field blob SQLite tidak direkomendasikan

    • Ukuran maksimum blob adalah 2GB
    • Objek harus diserialisasi/deserialisasi menjadi byte
    • File tetap diperlukan untuk berinteraksi dengan sistem/layanan lain
    • SQLite punya konfigurasi untuk menangani permintaan paralel, tetapi basis data terkunci karena permintaan yang saling bersaing
  • 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

    • File basis data disimpan sebagai cluster di disk
    • Sistem manajemen basis data dibuat agar nyaman digunakan untuk menyelesaikan domain dan masalah tertentu
 
halfenif 2024-07-28

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.

 
narusas 2024-07-29

Kalau 20 tahun lalu, harga SAN DISK Oracle pasti tidak murah..