Stack Overflow 显示,开发人员认为, PostgreSQL是2021年,他们最想要的数据库。DB-Engines第三次将PostgreSQL推荐为年度最受欢迎的数据库。
今年是开源数据库PostgreSQL的大好之年。上个月, PostgreSQL14全球发布,新版本附带了超过220个补丁,比以前增加了30%。
PostgreSQL 14 有如下巨大的变化:
01
PostgreSQL V14.0:性能增强
性能增强分为两部分,一部分无需DBA干预即可在后台实现,另外一部分需要DBA配置。两部分都提高存储和资源效率。
减少空间膨胀是改进之一。频繁更新的索引往往有死元组(dead tuples);任何已删除但仍占用空间的记录,也会导致空间膨胀。通常,只有vacuum运行时,这些元组(tuples)才会被移除。当一个page被填满时,更新或插入会导致页(page)分裂—这是不可逆的。即使现有页内的死元组(dead tuples)可能已被移除,也会发生这种分裂。在 PostgreSQL 14 中,会自动检测和删除死元组(dead tuples),从而减少了页面分裂次数,进而减少了索引膨胀。
与此同时,当数据被删除并且vacuum运行时,在14之前,PostgreSQL将该数据标记为要删除,然后等待下一轮vacuum 实际释放空间。一种新的算法允许立即删除该数据,从而更有效地释放空间。
现在,vacuum能够一次性识别并释放空间,这是减少空间利用率和提高效率的更有效方法。不过,开发人员和DBA将拥有回滚和时间点恢复(point-in-timerecovery)的常用缓冲。
PostgreSQL 14还为并行查询执行带来了更多功能,其中PostgreSQL可以设计查询计划,利用多个CPU更快地响应查询。现在,数据库可以并行执行返回查询和刷新物化视图的查询。
更重要的改变包括LibPQ的管道模式,这是开发人员用于将其应用程序连接到数据库的接口。PostgreSQL 14现在可以使用管道模式。LibPQ过去是单线程的,它将等待一个查询完成执行,然后再将下一个查询发送到数据库。现在开发人员可以将多个事务送到管道中,LibPQ将依次执行这些事务,并将结果反馈到应用程序中。应用程序不再需要等待第一个事务完成才能执行下一个事务。
另一个不需要费脑筋的是TOAST的升级,它现在允许LZ4压缩。TOAST是一个允许存储更大数据的特性。在版本14之前,它使用PGLZ,这是一种非常快速的压缩算法,但实际的压缩比很小。LZ4的速度也非常快,并且是无损的,这意味着你不会丢失任何数据,就像你用一张像素化的压缩照片那样,而且它也有很高的压缩比。
02
PostgreSQL v14.0:水平可扩展性和分布式工作负载增强
本版本新增内容的下一步是复制进行中的事务。
典型的集群设置几乎不会有单个节点,因为这将成为单点故障。它通常与一个主节点和两个从节点一起分发,它们都相互通信以确保同步。以前,大型事务被写入磁盘,直到事务完成,然后才复制到从节点。
使用PostgreSQL 14,可以将正在进行的事务复制到从节点,而无需等待事务完成。
水平可伸缩性的其他增强包括外部表(FDW)。使用FDW,您能够以特定的方式对数据进行切片,从而可以将数据分布到不同的服务器上,从而实现分布式工作负载的水平可扩展性。现在,您不仅可以在本地表中执行大容量插入,还可以在外部表中执行逐行插入。
PostgreSQL 12以来,本地查询可以并行运行,但现在您还可以并行扫描外部表。
03
PostgreSQL v14.0:扩展增强
对于数据库管理员来说,还对数据库的扩张(插件)进行了许多增强,提供了更深入的观测和统计数据。
PostgreSQL的核心引擎公开了一个API,允许用户编写自定义扩展以增强功能,而无需对核心引擎进行任何更改。最流行的扩展之一是pg_stat_statement,它监视数据库中的查询并跟踪统计数据。它使用查询哈希将唯一ID分配给查询,然后可以通过内核进行跟踪。
在PostgreSQL版本14中,将该哈希技术从扩展引入内核,因此您可以使用相同的哈希并与任何其他扩展一起处理相同的查询。以前,只有内核和pg_stat_statement知道该ID,现在任何扩展都可以使用相同的ID。
04
PostgreSQL v14.0:开发人员便捷增强
在开发应用程序过程中,我们不能指望开发人员也是数据库专家,在其他开发人员体验方面的改进中,已经对JSON进行了增强,进一步改进了非结构化数据的可用性,因此开发人员能够用PostgreSQL 14喜欢的语言进行开发,包括Python和Java。
PostgreSQL14还添加了多范围类型(multirange types)。在此PostgreSQL14之前,开发人员只能有一种范围类型,具有特定的起始点和终结点-例如办公室从上午9点到下午5点开放。现在,您可以在范围数组中指定一个非连续的范围,例如此会议室从上午9点到9点30分、11点到中午等等。现在,您可以将一天中的整个时段保存在同一个变量中。
PostgreSQL 11中添加了存储过程,使开发人员能够在一段代码中进行事务控制。PostgreSQL 14实现OUT参数,允许开发人员在其存储过程中使用多个参数返回数据。Oracle开发人员将熟悉此功能,并可以尝试从Oracle迁移到PostgreSQL时,使用此功能。
05
PostgreSQL v14.0:安全性增强
在PostgreSQL 14之前,PostgreSQL的一个潜在缺点是默认身份验证方法是MD5,此外,MD5不再符合PCI DSS支付卡标准。MD5利用双方持有的加密密钥。在发送数据时,您需要有一种机制来确保对方知道如何解密。然而,如果有人在中间截获,那么MD5就有很容易被破解。
PostgreSQL 14的默认身份验证方法现在是SCRAM,它符合行业标准,具有更高的安全性。发送数据时没有告诉接收者如何破解(解密),双方都已经知道如何解密。
PostgreSQL 14还对预定义的角色进行了增加,包括pg_read_all_data,允许将权限分配给能够读取所有数据的用户。PostgreSQL 14还添加了pg_write_all_data。pg_write_all_data向用户授予超级用户样式的权限,因此应谨慎使用。但在需要的情况下,它提供了很多便利。应用程序不断发展,数据库不断发展,模式不断发展。写入所有数据的总体权限可以确保用户继续拥有所需的权限,即合法地赋予这样的权限不会因为更新而丢失。