Perbedaan Tipe Data JSON dan JSONB pada PostgreSQL

Sejak versi 9.2 sudah dirilis (sekitar bulan September 2012), PostgreSQL memungkinkan kita untuk menyimpan data schemaless melalui tipe data JSON. Tidak hanya itu, berselang waktu 2 tahun kemudian, PostgreSQL kembali meluncurkan fitur baru berkaitan dengan tipe data JSON yang diberi nama JSONB. Lalu, apa yang membedakan tipe data JSON dan JSONB?

Mengutip penjelasan yang diberikan pada dokumentasinya:

There are two JSON data types: json and jsonb. They accept almost identical sets of values as input. The major practical difference is one of efficiency. The json data type stores an exact copy of the input text, which processing functions must reparse on each execution; while jsonb data is stored in a decomposed binary format that makes it slightly slower to input due to added conversion overhead, but significantly faster to process, since no reparsing is needed. jsonb also supports indexing, which can be a significant advantage.

Because the json type stores an exact copy of the input text, it will preserve semantically-insignificant white space between tokens, as well as the order of keys within JSON objects. Also, if a JSON object within the value contains the same key more than once, all the key/value pairs are kept. (The processing functions consider the last value as the operative one.) By contrast, jsonb does not preserve white space, does not preserve the order of object keys, and does not keep duplicate object keys. If duplicate keys are specified in the input, only the last value is kept.

Berdasarkan penjelasan di atas, saya akan mencoba untuk menunjukkan perbedaannya dengan melakukan eksperimen kecil. Eksperimen tersebut akan memasukkan 1.000.000 dokumen JSON yang dikelompokkan tiap 500 data dengan menggunakan script ruby. Spesifikasi mesin untuk kebutuhan eksperimen ini adalah 4 core CPU (1.4 GHz Intel Core i5) dan 4 GB RAM.

Kecepatan Input Data

Hasil dari eksperimen kecil yang dilakukan memang terlihat bahwa melakukan input pada tipe data JSON memang relatif lebih cepat dibandingkan JSONB.

Insert Tipe Data JSON
Insert Tipe Data JSON
Insert Tipe Data JSONB
Insert Tipe Data JSONB

Hal ini sesuai dengan kutipan penjelasan dokumentasi PostgreSQL di atas bahwa JSONB melakukan pemrosesan data terlebih dahulu sebelum data itu benar-benar disimpan.

Kecepatan Pengambilan Data

Berdasarkan kutipan penjelasan dokumentasi di atas, tertulis bahwa tidak ada lagi proses parsing data yang diambil dan hal itu membuat pengambilan data JSONB lebih cepat dibandingkan JSON.

Melihat hasil eksperimen yang telah dilakukan, hasilnya adalah seperti berikut.

Pengambilan Data JSON
Pengambilan Data JSON
Pengambilan Data JSONB
Pengambilan Data JSONB

Walaupun eksperimen ini sedikit “tidak adil”, mengingat jumlah data yang diambil untuk masing-masing kasus tidak sama, akan tetapi dapat dilihat walaupun jumlah data yang diambil lebih banyak, pengambilan data JSONB masih jauh lebih cepat dibandingkan pengambilan data yang bertipe JSON.

Indexing

Kelebihan lain yang ada pada JSONB adalah tipe data tersebut memperbolehkan kita untuk menggunakan index. Secara logika hal ini akan membuat proses pengambilan data menjadi jauh lebih cepat.

Untuk menunjukkan hasil dari penambahan index pada tipe data JSONB, maka eksperimen kembali diulang mulai dari proses input data hingga pengambilan data, setelah index ditambahkan pada salah satu atribut data.

Insert Tipe Data JSONB dengan Index
Insert Tipe Data JSONB dengan Index

Proses input akan menjadi lebih lama, selain JSONB harus memproses data yang dinput terlebih dahulu, juga ada proses untuk memperbarui index yang akan digunakan untuk melakukan pencarian data.

Pengambilan Data JSONB dengan Index
Pengambilan Data JSONB dengan Index

Berdasarkan eksperimen di atas, terlihat bahwa query plan postgreSQL tidak lagi melakukan sequential scan pada data JSONB, namun sudah menggunakan index untuk melakukan pencarian data.

Preservasi Input

Penjelasan berikutnya yang bisa kita baca pada kutipan di atas adalah tipe data JSON tidak mengubah sedikitpun data yang diinput. Oleh karena itu, jika ada whitespace yang banyak antara satu atribut dengan atribut yang lain, begitu pula lah bentuk yang akan disimpan pada tipe data JSON. Berbeda dengan tipe data JSONB yang akan membersihkan semua itu.

Preservasi Input pada JSON
Preservasi Input pada JSON
Pembersihan Input pada JSONB
Pembersihan Input pada JSONB

Selain itu, tipe data JSON juga memungkinkan kita untuk memiliki duplikasi kunci / atribut, sedangkan JSONB hanya akan mengambil atribut yang berada pada posisi paling akhir (jika ada duplikasi).

Duplikasi Kunci / Atribut pada JSON
Duplikasi Kunci / Atribut pada JSON
Duplikasi Kunci / Atribut pada JSONB
Duplikasi Kunci / Atribut pada JSONB

Ukuran File

Adapun hal lain yang tidak dijelaskan secara eksplisit pada dokumentasi PostgreSQL mengenai JSON dan JSONB adalah ukuran file untuk table yang mengandung tipe data JSONB akan relatif lebih besar dibandingkan table yang mengandung tipe data JSON. Hal ini belum termasuk, jika kita menambahkan index pada tipe data JSONB tersebut. Berdasarkan eksperimen yang telah dilakukan, dengan menggunakan 1.000.000 dokumen JSON, ukuran file yang dihasilkan adalah sebagai berikut.

Ukuran File
Ukuran File

Kehadiran JSON dan JSONB pada PostgreSQL memungkinkan kita untuk menyimpan dan mengolah data relasional dan schemaless pada 1 tempat. Akan tetapi, pemakaiannya tetap harus mempertimbangkan jenis masalah yang ingin diselesaikan. Beberapa saran yang dapat diberikan, antara lain:

  1. Walaupun JSON memungkinkan kita menyimpan lebih dari 1 kunci/atribut pada 1 data, akan tetapi memiliki struktur data yang lebih rapi tanpa duplikasi masih lebih baik.

  2. Gunakan JSONB, hanya jika aplikasi anda memiliki kebutuhan untuk melakukan pencarian dari data JSON yang disimpan, sehingga anda bisa menggunakan index untuk itu.

  3. Gunakan JSON / JSONB, jika memang tidak ada cara lain untuk anda selain menggunakan data schemaless untuk menyelesaikan masalah yang anda hadapi. Menggunakan tipe data non-JSON masih lebih baik, karena struktur datanya akan konsisten dan lebih mudah untuk di maintain.

Perbedaan Tipe Data JSON dan JSONB pada PostgreSQL

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s