Perbedaan Tipe Data JSON dan JSONB pada PostgreSQL

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.

[caption id=”attachment_1932" align=”alignnone” width=”643"]

Insert Tipe Data JSON[/caption]

[caption id=”attachment_1933" align=”alignnone” width=”656"]

Insert Tipe Data JSONB[/caption]

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.

[caption id=”attachment_1934" align=”alignnone” width=”660"]

Pengambilan Data JSON[/caption]

[caption id=”attachment_1935" align=”alignnone” width=”660"]

Pengambilan Data JSONB[/caption]

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.

[caption id=”attachment_1938" align=”alignnone” width=”651"]

Insert Tipe Data JSONB dengan Index[/caption]

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.

[caption id=”attachment_1939" align=”alignnone” width=”660"]

Pengambilan Data JSONB dengan Index[/caption]

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.

[caption id=”attachment_1942" align=”alignnone” width=”533"]

Preservasi Input pada JSON[/caption]

[caption id=”attachment_1943" align=”alignnone” width=”545"]

Pembersihan Input pada JSONB[/caption]

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).

[caption id=”attachment_1944" align=”alignnone” width=”660"]

Duplikasi Kunci / Atribut pada JSON[/caption]

[caption id=”attachment_1945" align=”alignnone” width=”660"]

Duplikasi Kunci / Atribut pada JSONB[/caption]

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.

[caption id=”attachment_1946" align=”alignnone” width=”345"]

Ukuran File[/caption]

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: