JSON vs. JSONB storage size - Mailing list pgsql-general
From | Thomas Kellerer |
---|---|
Subject | JSON vs. JSONB storage size |
Date | |
Msg-id | 2bf3fe6a-394b-73bb-12a4-64a12f5c246f@gmx.net Whole thread Raw |
Responses |
Re: JSON vs. JSONB storage size
Re: JSON vs. JSONB storage size Re: JSON vs. JSONB storage size |
List | pgsql-general |
I recently stumbled over the presentation "How to Use JSON in MySQL Wrong" by Bill Karwin[1] While most of the indexing part simply doesn't apply to Postgres, I was curious about the statement that the data type ofa json value inside the json matters as well (Slide 56) Apparently in MySQL storing {"a": 123456789} takes less space than {"a": '123456789'} So I tested that with Postgres both using json and jsonb - my expectation was, that this would be similar in Postgres aswell. However, it turned out that for a json column there was no difference at all (both versions would show up the same with pg_total_relation_size()) The table size with jsonb was bigger in general, but the one with the "integer" value was even bigger than the one with the"string" storage. The following little test script: create table json_length_test1 (id serial primary key, d json); insert into json_length_test1 select i, jsonb_build_object('a', 1234567890) from generate_series(1,1e6) t(i); create table json_length_test2 (id serial primary key, d json); insert into json_length_test2 select i, jsonb_build_object('a', '1234567890') from generate_series(1,1e6) t(i); create table jsonb_length_test1 (id serial primary key, d jsonb); insert into jsonb_length_test1 select i, jsonb_build_object('a', 1234567890) from generate_series(1,1e6) t(i); create table jsonb_length_test2 (id serial primary key, d jsonb); insert into jsonb_length_test2 select i, jsonb_build_object('a', '1234567890') from generate_series(1,1e6) t(i); select 'json', pg_size_pretty(pg_total_relation_size('json_length_test1')) as json_int_size, pg_size_pretty(pg_total_relation_size('json_length_test2')) as json_text_size union all select 'jsonb', pg_size_pretty(pg_total_relation_size('jsonb_length_test1')) as json_int_size, pg_size_pretty(pg_total_relation_size('jsonb_length_test2')) as json_text_size Returns (Postgres 12, Windows 10) ?column? | json_int_size | json_text_size ---------+---------------+--------------- json | 71 MB | 71 MB jsonb | 87 MB | 79 MB I am a bit surprised by this (not because the jsonb sizes are generally bigger, but that the string value takes less space) Is this caused by the fact that a string value compresses better internally? Thomas [1] https://www.slideshare.net/billkarwin/how-to-use-json-in-mysql-wrong
pgsql-general by date: