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

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介: 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数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
22小时前
|
SQL 关系型数据库 分布式数据库
【PolarDB开源】PolarDB Proxy配置与优化:提升数据库访问效率
【5月更文挑战第27天】PolarDB Proxy是阿里云PolarDB的高性能数据库代理,负责SQL请求转发和负载均衡。其关键配置包括:连接池管理(如最大连接数、空闲超时时间),负载均衡策略(轮询、权重轮询、一致性哈希),以及SQL过滤规则。优化方面,关注监控与调优、缓存策略、网络优化。通过这些措施,可提升数据库访问效率和系统稳定性。
25 1
|
1天前
|
负载均衡 关系型数据库 分布式数据库
【PolarDB开源】PolarDB读写分离实践:优化读取性能与负载均衡策略
【5月更文挑战第26天】PolarDB是云原生关系型数据库,通过读写分离优化性能和扩展性。它设置主节点处理写操作,从节点处理读操作,异步复制保证数据一致性。优化读取性能的策略包括增加从节点数量、使用只读实例和智能分配读请求。负载均衡策略涉及基于权重、连接数和地理位置的分配。实践示例中,电商网站通过主从架构、只读实例和负载均衡策略提升商品查询效率。PolarDB的读写分离与负载均衡为企业应对大数据和高并发提供了有效解决方案。
32 0
|
2天前
|
存储 关系型数据库 分布式数据库
【PolarDB 开源】PolarDB 存储引擎优化:PolarStore 的深度解析与优化
【5月更文挑战第25天】PolarDB的PolarStore存储引擎以其高效索引和优化的压缩算法提升数据存储与访问性能。通过并发控制保证事务正确性,同时支持数据压缩和索引优化。在实际应用中,优化包括调整索引结构、数据分区、事务管理及定期数据库维护。结合业务需求进行深度优化,可最大化PolarStore的性能潜力,推动数据库系统发展。
75 0
|
3天前
|
SQL 监控 关系型数据库
【PolarDB开源】PolarDB SQL优化实践:提升查询效率与资源利用
【5月更文挑战第24天】PolarDB是高性能的云原生数据库,强调SQL查询优化以提升性能。本文分享了其SQL优化策略,包括查询分析、索引优化、查询重写、批量操作和并行查询,以及性能监控与调优方法。通过这些措施,可以减少响应时间、提高并发处理能力和降低成本。文中还提供了相关示例代码,展示如何分析查询和创建索引,帮助用户实现更高效的数据库管理。
21 1
|
12天前
|
存储 关系型数据库 分布式数据库
数据库索引回表困难?揭秘PolarDB存储引擎优化技术
PolarDB分布式版存储引擎采用CSM方案均衡资源开销与可用性。
数据库索引回表困难?揭秘PolarDB存储引擎优化技术
|
12天前
|
存储 缓存 关系型数据库
关系型数据库数据库表设计的优化
您可以优化关系型数据库的表设计,提高数据库的性能、可维护性和可扩展性。但请注意,每个数据库和应用程序都有其独特的需求和挑战,因此在实际应用中需要根据具体情况进行调整和优化。
20 4
|
12天前
|
缓存 监控 关系型数据库
关系型数据库优化查询语句
记住每个数据库和查询都是独特的,所以最好的优化策略通常是通过测试和分析来确定的。在进行任何大的更改之前,始终备份你的数据并在测试环境中验证更改的效果。
25 5
|
12天前
|
存储 SQL 关系型数据库
关系型数据库存储优化
关系型数据库存储优化
27 1
|
6天前
|
关系型数据库 分布式数据库 数据库
【PolarDB 开源】PolarDB 性能调优实录:提升数据库集群吞吐量的技巧
【5月更文挑战第22天】PolarDB 性能调优关键点包括硬件资源配置、数据库参数调整、索引优化、分区策略、事务优化及性能监控。创建高效索引如`CREATE INDEX idx_name ON table_name (column_name);`,根据业务场景选择分区方式,调整事务隔离级别以提升并发性能。监控 CPU、内存等指标,定期维护数据库,结合业务特点综合调优,从而提升数据库集群吞吐量。这些技巧有助于发挥PolarDB潜力,支持业务高效运行。
109 5
|
1天前
|
Cloud Native 关系型数据库 分布式数据库
【PolarDB开源】PolarDB与云原生数据库比较:特点、优势与选型建议
【5月更文挑战第26天】PolarDB是阿里云的云原生数据库,以其计算存储分离、一写多读架构和数据一致性保障脱颖而出。与Amazon Aurora和Google Cloud Spanner相比,PolarDB在中国市场更具优势,适合读多写少的场景和需要严格数据一致性的应用。企业在选型时应考虑业务需求、地域、读写比例和兼容性。PolarDB作为优秀解决方案,将在云原生数据库领域持续发挥关键作用。
21 1

相关产品

  • 云原生数据库 PolarDB