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

目录
相关文章
|
存储 前端开发 关系型数据库
一站式元数据治理平台——Datahub入门宝典(二)
随着数字化转型的工作推进,数据治理的工作已经被越来越多的公司提上了日程。作为新一代的元数据管理平台,Datahub在近一年的时间里发展迅猛,大有取代老牌元数据管理工具Atlas之势。国内Datahub的资料非常少,大部分公司想使用Datahub作为自己的元数据管理平台,但可参考的资料太少。 所以整理了这份文档供大家学习使用。本文档基于Datahub最新的0.8.20版本,整理自部分官网内容,各种博客及实践过程。
4217 0
一站式元数据治理平台——Datahub入门宝典(二)
|
11月前
|
Cloud Native Java 中间件
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
503 0
|
XML JSON API
如何从 Swagger 导出 API 文档
Swagger 使这项任务相对简单,允许开发者以各种格式(如 JSON 和 YAML)导出 API 文档。在这篇博文中,我们将详细探讨如何从 Swagger 导出 API 文档。
如何从 Swagger 导出 API 文档
|
存储 JavaScript 前端开发
基于 ant-design-vue 和 Vue 3 封装的功能强大的表格组件
VTable 是一个基于 ant-design-vue 和 Vue 3 的多功能表格组件,支持列自定义、排序、本地化存储、行选择等功能。它继承了 Ant-Design-Vue Table 的所有特性并加以扩展,提供开箱即用的高性能体验。示例包括基础表格、可选择表格和自定义列渲染等。
1206 6
|
消息中间件 Kafka 测试技术
消息队列 MQ 性能大揭秘
本文对比了RabbitMQ、RocketMQ、Kafka和Pulsar四款消息队列的性能。RabbitMQ的吞吐量为万级,延迟在低吞吐量时可低至微秒级;高吞吐量下延迟显著上升。RocketMQ官方宣称支持万亿级吞吐量,实际测试中可达百万级TPS,延迟为毫秒级。Kafka和Pulsar的吞吐量均为百万级,Kafka延迟低至2ms,Pulsar延迟约10ms。总体来看,Kafka在高吞吐量下表现最优,而RabbitMQ适合对速度与可靠性要求高的低吞吐量场景。
1612 0
消息队列 MQ 性能大揭秘
|
弹性计算 网络协议 应用服务中间件
教你如何使用阿里云云服务器搭建https的网站
所需材料: 域名1个。 虚拟机或者云服务器1台。 ssl证书1个。 前提准备: 域名最好要备案,在国内使用比较方便。 推荐使用阿里云服务器。 ECS为Linux系统,安装的是宝塔控制面板 阿里云可以免费申请ssl证书。
6910 1
教你如何使用阿里云云服务器搭建https的网站
|
传感器 缓存 Prometheus
在Linux中,如何进行硬件性能监控?
在Linux中,如何进行硬件性能监控?
|
Linux
如何让linux显示器命令行界面不显示
若需在命令行界面快速关闭屏幕,可选方法包括:使用`setterm --blank force`立即关闭屏幕;利用`sudo vbetool dpms off`将显示器置于低功耗模式;在X server环境下执行`xset dpms force off`关闭屏幕;或是针对笔记本通过`echo 0 | sudo tee /sys/class/backlight/*/brightness`关闭背光。以上任一方法均可实现屏幕关闭,部分操作需要管理员权限,屏幕通常会在按键或移动鼠标后自动恢复。
3033 9
|
前端开发
CSS Grid 布局:span 关键字
CSS Grid 布局:span 关键字
403 0
|
前端开发
基于Camunda的开源项目
基于Camunda实现基本功能以及中国式审批流程相关功能
1209 0
基于Camunda的开源项目