JSONB壓縮版本ZSON

德哥發表於2017-06-08

標籤

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


相關文章