PostgreSQL Json应用场景介绍和Shared Detoast优化

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: PostgreSQL Json应用场景介绍和Shared Detoast优化

JSONB应用场景

PostgreSQL中有2种和json相关的数据类型,json和jsonb,本文指的是jsonb,  也推荐大家使用jsonb。

假设一张表所有的记录都有属性 attr1..attr10,但只有部分记录存在attr11..attr20属性,同时后续还有可能增加 attr21, attr22,这个时候创建一个包含json列的表就非常合适。

create table t1 (attr1 numeric,  attr2 int, ..  attr10 text, extra jsonb);

attr11..attr20 的数据作为k-v对存储在extra属性内。 如果将来有了 attr21, attr22,直接存放到 extra 属性内即可,完全不需要对表结构进行修改。  

除了使用json数据类型,还有其他的解决方案可以尝试。比如将 extra 设置为一个 text / binary 类型,由在客户端进行序列化和反序列化。 这种方式的缺陷在于需要将数据传输到客户端才能进行运算,无法使用更为先进的各种扫描方式,也增大了网络的传输量, 而使用json/jsonb就完全没有这类问题。

select extra->'attr11' from t1 where extra->>'att20' = 'apple';

我们可以在服务端进行数据的过滤和投影,减少了网络的传输量。 同时也可以在 extra->>'att20'  创建索引,来加速过滤条件。

另外一种极端设计是将所有的属性存放到一个jsonb类型中, 创建如下的表结构:

create table t2(data jsonb)

这个方案也不是最优的,因为对于所有的记录都需要重复记录attr1,  attr10的属性,比如同一行数据,t1 和 t2 的存储方式分别如下:

t1:  1|2|3|..|'20'|{'attr21': 2, 'attr22': 3}
t2:  {'attr1': 1, 'attr2': 2, 'attr3': 3, ... 'attr21': 2, 'attr22': 3}

t2 的设计方式会带来存储和网络传输上的开销。 这两个问题都可以通过压缩来缓解,但压缩/解压本身也是有代价的。

允许同时使用jsonb数据类型和传统数据类型是PostgreSQL的一大特色,灵活使用这个能力可以带来极大的好处。 继续上面的案例:假设后来我们发现 attr11 对于所有的记录都存在, 我们完全可以将表结构改成

create table t1 (attr1 numeric,  attr2 int, ..  attr10 text, attr11 text,  extra jsonb);

随后应用程序再做少量的改变就可以。相比较于一开始选择了仅支持文档型的数据库来说,这种修改不需要应用程序增加新的数据源,  不需要管理新的连接,只需要修改一下 attr11的访问方式即可。

Shared Detoast Datum能力

对于一个json的数据类型来说,数据稍微大一些就会使用到toast能力。 拿t1的数据来说,大致的工作原理可以简化为:

t1: 
  1|2|3|..|{pointer-x}
pg_toast_{t1}
  pointer-x| 1 | {attr11:.., attr12: ...}
  pointer-x| 2 | {attr16:.., attr20: ...}

只有当我们需要访问 pointer-x 的真实的值的时候,我们“才” 组装出来 {attr11: 11, ...,  attr20: 20} 的值,而组装的过程被称之为detoast,  这个组装的过程也是比较消耗资源的。 关于toast 更为详细的介绍请参考: https://zhuanlan.zhihu.com/p/142281841

对于如下SQL:

select extra->'attr11'  from t1 where  extra->>'att20'  = 'apple';

extra->>'att20'  和 extra->'attr11' 都需要访问完整的extra数据,在原生的PostgreSQL中会进行detoast 2次。而下面的语句就会detoast 4次。当extra稍微大一些,大量的时间都是消耗在了detoast环节了。而shared detoast datum就是为了解决这个问题而设计的,对于同一个数据,我们只会detoast一次。 shared detoast datum的能力会在阿里云PolarDB-PG14的4月份的版本中发布。

select extra->'attr11', extra->'attr12' 
from t1
where extra->>'att20'  = 'apple' 
  and extra->>'attr19' = 'cloud';

PolarDB PG简介

PolarDB PostgreSQL版(简称PolarDB-PG)是一款阿里云自主研发的云原生关系型数据库产品,100% 兼容 PostgreSQL,高度兼容Oracle语法(公有云版支持Oracle语法);采用基于 Shared-Storage 的存储计算分离架构,具有极致弹性、毫秒级延迟、HTAP 的能力和高可靠、高可用、弹性扩展等企业级数据库特性。同时,PolarDB 具有大规模并行计算能力,可以应对OLTP与OLAP混合负载。

作者介绍

樊智辉,花名 一挃,阿里云PolarDB PG产品优化器方向负责人,致力于为用户提供更好的PostgreSQL服务。

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
4月前
|
监控 关系型数据库 数据库
PostgreSQL的索引优化策略?
【8月更文挑战第26天】PostgreSQL的索引优化策略?
116 1
|
3月前
|
缓存 关系型数据库 数据库
如何优化 PostgreSQL 数据库性能?
如何优化 PostgreSQL 数据库性能?
149 2
|
4月前
|
监控 关系型数据库 数据库
如何优化PostgreSQL的性能?
【8月更文挑战第4天】如何优化PostgreSQL的性能?
272 7
|
5月前
|
XML JSON 缓存
优化Java中XML和JSON序列化
优化Java中XML和JSON序列化
|
3月前
|
XML 存储 JSON
Twaver-HTML5基础学习(19)数据容器(2)_数据序列化_XML、Json
本文介绍了Twaver HTML5中的数据序列化,包括XML和JSON格式的序列化与反序列化方法。文章通过示例代码展示了如何将DataBox中的数据序列化为XML和JSON字符串,以及如何从这些字符串中反序列化数据,重建DataBox中的对象。此外,还提到了用户自定义属性的序列化注册方法。
50 1
|
2月前
|
数据采集 JSON 数据处理
抓取和分析JSON数据:使用Python构建数据处理管道
在大数据时代,电商网站如亚马逊、京东等成为数据采集的重要来源。本文介绍如何使用Python结合代理IP、多线程等技术,高效、隐秘地抓取并处理电商网站的JSON数据。通过爬虫代理服务,模拟真实用户行为,提升抓取效率和稳定性。示例代码展示了如何抓取亚马逊商品信息并进行解析。
抓取和分析JSON数据:使用Python构建数据处理管道
|
1月前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
|
1月前
|
JSON 缓存 前端开发
PHP如何高效地处理JSON数据:从编码到解码
在现代Web开发中,JSON已成为数据交换的标准格式。本文探讨了PHP如何高效处理JSON数据,包括编码和解码的过程。通过简化数据结构、使用优化选项、缓存机制及合理设置解码参数等方法,可以显著提升JSON处理的性能,确保系统快速稳定运行。
|
1月前
|
JSON API 数据安全/隐私保护
拍立淘按图搜索API接口返回数据的JSON格式示例
拍立淘按图搜索API接口允许用户通过上传图片来搜索相似的商品,该接口返回的通常是一个JSON格式的响应,其中包含了与上传图片相似的商品信息。以下是一个基于淘宝平台的拍立淘按图搜索API接口返回数据的JSON格式示例,同时提供对其关键字段的解释
|
2月前
|
JSON JavaScript Java
在Java中处理JSON数据:Jackson与Gson库比较
本文介绍了JSON数据交换格式及其在Java中的应用,重点探讨了两个强大的JSON处理库——Jackson和Gson。文章详细讲解了Jackson库的核心功能,包括数据绑定、流式API和树模型,并通过示例演示了如何使用Jackson进行JSON解析和生成。最后,作者分享了一些实用的代码片段和使用技巧,帮助读者更好地理解和应用这些工具。
159 0
在Java中处理JSON数据:Jackson与Gson库比较

热门文章

最新文章

相关产品

  • 云原生数据库 PolarDB
  • 下一篇
    DataWorks