13 poin oleh GN⁺ 2023-12-07 | 1 komentar | Bagikan ke WhatsApp
  • SQLite menulis ulang fungsi JSON yang sudah ada. Bergantung pada pola penggunaan, eksekusinya bisa beberapa kali lebih cepat
  • Fungsi JSON awalnya bekerja dalam 3 tahap
    1. Mengurai JSON ke format biner internal yang mudah diproses oleh kode C
    2. Menjalankan operasi yang diminta, seperti mencari field tertentu atau memodifikasi JSON
    3. Jika operasi mengubah JSON, format biner internal diubah menjadi string JSON RFC-8279 untuk ditampilkan atau disimpan
  • Selain tahap 2, tahap 1 dan 3 adalah overhead
  • SQLite menggunakan JSON dalam bentuk biner internal yang berisi banyak pointer. Ini cocok untuk program C, tetapi sulit diserialisasikan
  • Melalui penulisan ulang JSONB, representasi biner internal JSON ini diubah menjadi array byte berurutan yang bisa dibaca atau ditulis sebagai SQL BLOB
  • Dengan begitu, representasi JSON yang digunakan secara internal bisa disimpan di database alih-alih sebagai teks JSON, sehingga overhead tahap 1 dan 3 dapat dihilangkan

Perubahan

  • Semua fitur yang ada tetap dipertahankan. Hanya fungsi baru yang ditambahkan
  • Kini semua fungsi JSON yang menerima teks JSON sebagai input juga menerima konten biner JSONB untuk parameter yang sama
    • Tidak perlu memberi tahu fungsi apakah akan mengambil teks atau data biner. Fungsi akan menentukannya sendiri
  • Kini fungsi JSON yang menghasilkan JSON tersedia dalam dua versi
    • Fungsi json_ yang lama tetap bekerja seperti sebelumnya
    • Ada fungsi jsonb_ yang mengembalikan JSONB, bukan teks JSON, sehingga tahap 3 dilewati dalam pemrosesan umum
  • Jika aplikasi tidak diubah, kecepatannya memang sedikit meningkat (1%), tetapi semuanya tetap bekerja sama seperti sebelumnya
  • Namun, jika aplikasi diubah untuk mulai menyimpan JSONB alih-alih teks JSON, setidaknya untuk pekerjaan yang sangat intensif memakai JSON bisa terlihat peningkatan kinerja hingga 3x
  • Selain itu, JSONB dalam banyak kasus sedikit lebih kecil daripada teks JSON (sekitar 5% atau 10% lebih kecil), jadi jika banyak memakai JSON, ukuran database juga bisa sedikit berkurang

1 komentar

 
GN⁺ 2023-12-07
Komentar Hacker News
  • Ada banyak kebingungan tentang JSONB

    • JSONB digunakan oleh aplikasi dengan cara yang sangat mirip dengan tipe data JSON.
    • Aplikasi tetap membaca dan menulis string JSON, tetapi tidak melihat isi JSONB yang sebenarnya.
    • Fungsi-fungsi SQL yang sama juga tersedia dengan prefiks jsonb_.
    • Tipe data JSON disimpan di disk sebagai JSON, sedangkan JSONB disimpan dalam format biner khusus.
    • Tipe data JSON harus mem-parsing seluruh JSON untuk menjalankan operasi, sedangkan JSONB dapat melewati tahap parsing dan langsung bekerja pada format di disk.
    • Jika hanya membaca dan menulis seluruh blob JSON di SQLite, tipe data JSON sudah cocok, tetapi jika melakukan kueri atau manipulasi data dengan SQL, JSONB lebih cocok.
  • JSONB adalah format yang disediakan Postgres, dan direkomendasikan karena performa baca yang lebih baik dibanding JSON biasa.

  • Butuh beberapa tahun untuk memahami tujuan document store, dan ini sangat bagus untuk membangun POC (Proof of Concept).

    • Peningkatan dukungan JSON akan membantu menjadikan SQLite sebagai document store yang layak.
    • Dengan men-serialisasi dan men-deserialisasi pesan Protobuf untuk mendapatkan dukungan tipe penuh, lalu menjadikan kolom ini sebagai JSONB, kolom tersebut bisa difilter tanpa perlu membentangkan data yang dapat dicari ke kolom lain.
  • Ada rasa penasaran tentang proses rilis SQLite.

    • Rilis terbaru adalah 3.44, dan JSONB termasuk dalam snapshot pra-rilis.
    • Ingin memakai fitur ini di D1 milik Cloudflare dan Fly.io, tetapi versi SQLite mereka mungkin tidak dipublikasikan atau sudah dikustomisasi.
    • Perubahan API bisa melanggar janji Cloudflare bahwa file dump/kueri yang kompatibel dengan SQLite dapat diimpor.
  • JSONB bisa dicoba di snapshot pra-rilis atau playground.

  • Ide inti dari spesifikasi JSONB adalah bahwa setiap elemen dimulai dengan header yang berisi ukuran dan tipe.

    • Ada usulan bahwa menambahkan penanda ukuran ke spesifikasi JSON dapat mengurangi memori yang dibutuhkan untuk pemrosesan JSON.
  • Familiar dengan BSON milik MongoDB, tetapi tidak dengan JSONB.

    • Merujuk ke artikel blog yang menjelaskan perbedaan JSONB dan BSON.
  • JSONB memengaruhi performa.

  • Andai ada cara untuk mengompresi data JSON di banyak baris.

    • Ada blob yang sangat mirip di setiap baris, dan dibutuhkan cara untuk mengurangi ruang penyimpanan bagi banyak blob serupa di banyak baris.
  • Terlepas dari format internalnya, ini bisa langsung digunakan di aplikasi.

    • Misalnya, pada bulk insert di Python, ada overhead yang terlihat jelas pada pemanggilan insert per baris.
    • JSONB dapat meningkatkan performa dengan menggunakan CTE (Common Table Expressions).
    • json_each dapat menerima parameter yang di-bind dari aplikasi sebagai blob JSONB.