JSONB 压缩版本 ZSON

    xiaoxiao2024-01-14  138

    标签

    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

    相关资源:cpp-ZSON是一个PostgreSQL扩展用于透明地JSONB压缩
    最新回复(0)