532
技術社區[雲棲]
JSONB 壓縮版本 ZSON
標簽
PostgreSQL , json , jsonb , zson
背景
json, jsonb是PostgreSQL裏麵的一種schemaless數據類型,zson是兼容json,jsonb的一種壓縮類型,通過訓練的方式生成字典,通過字典進行壓縮。
通常獲得的壓縮比比較客觀,壓縮後可以節約存儲空間,節約SHARED BUFFER,提高TPS。
安裝
git clone https://github.com/postgrespro/zson
cd zson
export PATH=/home/digoal/pgsql/bin:$PATH
make
make install
make installcheck
connect to database, create extension
psql db
create extension zson;
用法
1 通過訓練,構造字典
訓練函數接口如下
zson_learn(
tables_and_columns text[][],
max_examples int default 10000,
min_length int default 2,
max_length int default 128,
min_count int default 2
)
需要提供被訓練的表,以及JSON字段名
select zson_learn('{{"table1", "col1"}, {"table2", "col2"}}');
建議使用真實數據進行訓練,確保訓練得到的字典對實際數據有效。
查看訓練好的字典
select * from zson_dict;
2 使用zson類型
字典訓練完成後,寫入數據,zson將以字典形式壓縮存儲。
zson_test=# create table zson_example(x zson);
CREATE TABLE
zson_test=# insert into zson_example values ('{"aaa": 123}');
INSERT 0 1
zson_test=# select x -> 'aaa' from zson_example;
-[ RECORD 1 ]-
?column? | 123
字典版本
每次調用zson_learn都會生成新的字典,所有字典都會緩存到內存中。
新寫入的zson數據會使用最新版本的字典進行壓縮,不影響老的ZSON數據。
使用zson_info可以查看zson值使用的字典版本。
zson_test=# select zson_info(x) from test_compress where id = 1;
-[ RECORD 1 ]---------------------------------------------------
zson_info | zson version = 0, dict version = 1, ...
zson_test=# select zson_info(x) from test_compress where id = 2;
-[ RECORD 1 ]---------------------------------------------------
zson_info | zson version = 0, dict version = 0, ...
刪除字典
當所有的ZSON都沒有使用舊的字典時,才能刪除舊字典,否則請不要刪除。
delete from zson_dict where dict_id = 0;
評估是否需要重新訓練字典
當發現壓縮比升高時,可能需要重新訓練字典。
或者根據json數據寫入的持續,數據內容的變化等,進行調度。
當數據內容變化很大時,可能需要重新生成字典。
select pg_table_size('tt') / (select count(*) from tt)
生成新的字典後,通過zson_dict,對比不同版本的字典內容,也能知道新字典是否有必要。(請務必使用真實數據生成字典)
參考
https://github.com/postgrespro/zson
最後更新:2017-06-08 11:31:47