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

时间: 2024-08-18 03:21:16

JSONB 压缩版本 ZSON的相关文章

AI(OtterTune)引波澜 - AI会洗牌数据库行业吗? DBA如何转变思想

标签 PostgreSQL , 机器学习 , AI , 自动优化 , DBA , 科学计算 背景 最近AI的新闻特别多,席卷了围棋圈之后,成为了技术圈和媒体热捧的话题. 今天又一个产品借AI上头条了 - OtterTune ,一个数据库参数调优的产品,借助机器学习的技术,生成最优的数据库参数. 下面是这个产品的论文 <Automatic Database Management System Tuning Through Large-scale Machine Learning> http://

IIS6和IIS7对静态文件gzip压缩方式

先说明下为什么要写这篇文章,以及纠结于这个"小问题".首先开启静态文件的gzip压缩非常有利用提高网站的访问速度,并且有效减少蜘蛛爬行静态页面的time-taken,同时也不会像开启动态文件压缩一样可能会对百度蜘蛛造成200 0 64的抓取问题,所以一方面,网站速度快有利于提高用户体验,另一方面,google管理员博客在今年已经明确表示网站速度是排名的因素之一,而对于拿国外主机做百度中文站优化,time-taken不理想会导致百度蜘蛛内页抓的少,国平之前在自己博客文章网页加载速度是如何

DB2通过深度压缩进行存储优化:行压缩

行压缩自 DB2 for Linux, UNIX, and http://www.aliyun.com/zixun/aggregation/13559.html">Windows 9.1 版本产品(DB2 9.1 版本)开始引入.自此以后每个版本均对行压缩功能进行了大幅改进,并在 DB2 10.1 版本的新一代自适应压缩功能中达到极致.行压缩要求具备 DB2 Storage Optimization Feature 许可. 通过压缩技术节省存储空间通常意味着减少读取压缩表中的数据的物理 I

jQuery扩展以及gzip压缩测试

  <!doctype html> <html> <head> <meta http-equiv="content-type" content="text/html; charset=gb3212"> <title>javascript测试</title> <script type="text/javascript" src="http://files.cnb

nginx静态压缩模块ngx_http_gzip_static_module配置及使用

nginx静态压缩和apache gzip压缩类似,原理也差不多,本文我们来介绍一下nginx静态压缩模块ngx_http_gzip_static_module的一些使用方法. 在搭建squid网页加速的时候,对于大的css 或者js要进行压缩,然后再进行缓存,这样能够提高减小下载量提高页面响应速度.如果你用的是squid 3.0以前的版本并且用的是 ngnix server的话可能会碰到如下问题: 不用squid直接打开页面则客户端返回的是压缩的状态,如果启用squid加速会发现下载下来的页面

使用GruntJS构建Web程序之合并压缩篇_node.js

有如下步骤: 1.新建项目Bejs2.新建文件package.json3.新建文件Gruntfile.js4.命令行执行grunt任务  一.新建项目Bejs源码放在src下,该目录有两个子目录asset和js.js下放selector.js和ajax.js,这在上一篇已经讲了如何合并压缩它们.这篇只关注asset目录,asset目录下放了一些图片和css文件.一会会把两个css资源reset.css和style.css合并,压缩到dest/asset目录.一个合并版本all.css,一个压缩版

ASP.NET Core MVC压缩样式、脚本及总是复制文件到输出目录

前言 在.NET Core之前对于压缩样式文件和脚本我们可能需要借助第三方工具来进行压缩,但在ASP.NET MVC Core中则无需借助第三方工具来完成,本节我们来看看ASP.NET Core MVC为我们提供了哪些方便. 自动压缩样式和脚本 当我们在测试环境中肯定不需要压缩脚本的,如果一旦压缩脚本的话,若在控制台出现错误不利于我们调试,但是在生产环境中我们通过压缩脚本或者样式一来可以减少传输流量,二来可以加速页面加载时间,换句话说,此时我们需要测试环境和生产环境对应的原生版本和压缩版本,那么

自己动手丰衣足食之征服jQuery插件编写

原文地址:http://www.cnblogs.com/Wayou/p/jquery_plugin_tutorial.html 要说jQuery 最成功的地方,我认为是它的可扩展性吸引了众多开发者为其开发插件,从而建立起了一个生态系统.这好比大公司们争相做平台一样,得平台者得天下.苹果,微软,谷歌等巨头,都有各自的平台及生态圈. 学会使用jQuery并不难,因为它简单易学,并且相信你接触jQuery后肯定也使用或熟悉了不少其插件.如果要将能力上升一个台阶,编写一个属于自己的插件是个不错的选择.

CSS中Font的一些基本知识点归纳总结

1.什么是字体 字体是文字的外在形式,就是文字的风格,是文字的外衣.比如行书.楷书.草书,都是一种字体.同样一个字每个人写起来都会有差异,可以说每个人都有一套潜在的字体库.对于web页面来说,字体就是计算机上存储的一套文字显示方式.通过对文字进行一些特殊处理(比如末端加强)来提高不同环境中文字的可读性. 比如同样大小的文字,在不同字体下的可读性是不同的. 一般来讲,一款字库的诞生,要经过字体设计师的创意设计.字体制作人员一笔一划的制作.修改,技术开发人员对字符进行编码.添加程序指令.装库.开发安