PostgreSQL 12 正式发布
2019-10-05 22:37:16 阿炯

2019年10月3日,PostgreSQL全球开发组宣布世界上功能最为强大的开源数据库发布PostgreSQL第12版。PostgreSQL 12版在各方面都得到了加强,包括显著地提升查询性能,特别是对大数据集,总的空间利用率方面。

该版本为应用程序开发人员提供了更多的功能,比如对SQL/JSON路径表达式的支持,优化公共表达式(WITH查询)的执行,以及对生成列的支持等。PostgreSQL除了持续对PostgreSQL系统的可扩展性、稳健性进行开发外,还更多地在本地化、授权控制以及更加容易的管理进行增强。这个版本也引入了可插拨的表存取接口,来允许开发者在表的创建和使用时使用不同的存取方式。

“在PostgreSQL后面的开发者社区为PostgreSQL 12版所作的大量工作,让我们用户可以以较小的成本换来性能和空间管理等储特性,包括企业级安全、后台管理和SQL/JSON支持等功能”,作为全球开发组核心成员之一的Dave Page说道,“这个版本延续了PostgreSQL一直以来的对大大小小各级别数据量的轻松管理,同时在生产环境中的兼具灵活性、可靠性,赢得了长期的声誉”。

得益于超过20年以上的开源产品开发,PostgreSQL已成长为各种大小规模组织喜爱的开源关系数据库产品。系统持续得到行业的认可,2017、18连续两年被DB-Engines评选为"年度优秀数据库",2019年度又被OSCON国际开源组织评为“终身成就奖”的开源产品,该版本在各方面都得到了加强,包括显著地提升查询性能,特别是对大数据集,总的空间利用率方面。PostgreSQL 12专注于性能和优化,此版本的发布并未考虑到全新的闪亮功能;相反它是对现有PostgreSQL功能的微调和精心设计的实现。因为PostgreSQL每年都会发布新版本,所以并不是每一个新功能都完全具备。在发布了几个版本之后,当该功能有机会从其最初的实现中发展出来时,其性能将得到改善,边缘情况将得到支持,缺失的功能将得到实现。


这个版本为应用程序开发人员提供了更多的功能,比如对 SQL/JSON 路径表达式的支持,优化公共表达式(WITH查询)的执行,以及对生成列的支持等。PostgreSQL 除了持续对 PostgreSQL 系统的可扩展性、稳健性进行开发外,还更多地在本地化、授权控制以及更加容易的管理进行增强。这个版本也引入了可插拨的表存取接口,来允许开发者在表的创建和使用时使用不同的存取方式。具体如下:

全面的性能提升

PostgreSQL 12版本在性能和易维护性方面有了显著的增强,尤其是对索引和分区子系统。对标准索引类型B树索引进行了优化,以使其可以可以更好地处理索引更新频率较高类型的负载的的总体性能,使用最常使用的TPC-C 性能测试,PostgreSQL 12 平均可以提升约 40% 的空间利用率和查询性能。

对分区表的查询也得到了较大改进,特别是对那些有数千个分区的表,而结果只需从几个有限的分区提取数据的查询。PostgreSQL 12 对通过 INSERT 和COPY指令将数据加入分区表的操作,也有加强,包括现在可以在不阻塞查询的情况下增加新的分区。

另外,PostgreSQL 12 对索引的优化也提升了总体的性能,包括生成 GiST、GIN 或 SP-GiST 索引的 WAL 日志的负载显著减少,在 GiST 类型索引上创 建INCLUDE选项的包含索引,SP-GiST 索引现在支持<->距离操作的 K-NN(即相邻最近)查询,以及CREATE STATISTICS指令现在支持最常用值 MCV 的统计来帮助那些字段值非均匀分布的查询生成更优化的查询计划。

通过使用 LLVM,从 PostgreSQL 11 版引入的 JIT 即时编译,在 PostgreSQL 12 中缺省已是启用状态,JIT 即时编译对带有 WHERE 条件、对象列表、聚合以及一些内部操作都会提供性能上的帮助。当然,用户在安装或是编译时需要包含 LLVM 模块。

对 SQL 标准一致性和功能的增强

PostgreSQL 一直以来以其对 SQL 标准符合性而著称,这也是其名称由 POSTGRES 改为 PostgreSQL 的一个小原因。PostgreSQL 12 又增加了几个新特性来持续实现对 SQL 标准的符合性的强化。

PostgreSQL 12 加入了对 JSON 文档进行查询时使用 JSON 路径表达式的功能,这也是 SQL/JSON 中定义的规范。对使用 JSONB 格式保存的文档,这些查 询可以利用已有的索引机制来高效地提取数据。

公共表达式,也称之为 WITH 查询,在 PostgreSQL 12 中可以实现非物化操作处理,这对很多现在已有的查询有很大帮助。目前在这个版本中,WITH 查询的前提条件是非递归查询并且仅可被外层查询引用一次。

PostgreSQL 12 也引入了“生成列”功能,这也是 SQL 标准中的要求,这些字段值是通过同一表中其它列计算而来的。在这一版本中,PostgreSQL 支持“保存生成列值”的功能,即将这些计算出来的数据存储在磁盘上。

本地化

PostgreSQL 12 扩充了对 ICU 排序规则的支持,允许用户自行定义非标准的排序方式,比如允许大小写不敏感或是按口音不敏感的比较规则。

授权控制

PostgreSQL 通过再次扩展了一些的安全方面的功能来强化了它本来就很稳健的权限控制。这个版本中通过 GSSAPI 接口支持客户端和服务端的双向加密, 如果在编译时加入 OpenLDAP 模块,PostgreSQL 也支持搜索 LDAP 服务器的功能。另外,PostgreSQL 12 现在支持多约束的授权方式。如在使用scram-sha-256的授权方式,PostgreSQL 服务器现在可以强制一个客户端在提供用户名、使用clientcert=verify-full选项,再必须提供有效的 SSL 证书的方式来强化安全授权。

系统管理

PostgreSQL 12 的REINDEX CONCURRENTLY指令可以在不影响新的索引写入的前提下让用户执行重那建索引操作,这有助于用户实现不停机对较大索引的重建。可通过使用pg_checksums指令对停机的 PostgreSQL 来开启或关闭页校验功能,该功能有助于检查已写入磁盘的数据一致性,而以前版本中该操作仅允许在 initdb的阶段来执行。


下面是对PostgreSQL 12中八个最重要的改进的盘点。

1.分区性能

分区并不是一项新功能,它已经存在了好几年了,但是分区开销却降低了性能。PostgreSQL 11引入了一些分区性能改进,而PostgreSQL 12提供了完善的实现。对于从具有数千个分区的其他数据库迁移来的用户,PostgreSQL 12现在通过提供可同时有效处理数千个分区的功能而带来性能优势。分区性能增强可以提高查询性能,尤其是INSERT和COPY语句的性能。此外,用户现在可以更改分区表而不会阻止查询,并可以使用外键引用分区表。

2.B树增强

B-Tree功能是近年来对PostgreSQL添加的最复杂的功能之一。使用B树的好处是减少了访问的磁盘块的数量。考虑到B-Tree技术可以追溯到1970年代,很难对已经存在数十年的可靠功能进行改进。但是PostgreSQL 12团队致力于提供可自动启用的重大性能改进,旨在避免某些极端情况和B树代码中曾经存在的“病理行为”。现在通过更有效地利用空间,多列索引大小最多可减少40%,从而节省了磁盘空间。具有重复项(非唯一B树索引)的索引的性能得以提高,并且从索引中删除元组(行)的真空运行效率更高。此外,索引更新期间的锁定要求有所降低。

3.多列最有价值(MCV)统计信息

此更新已经进行了几年的开发,旨在解决多年来引起投诉的问题:查询中相关列的边缘情况。以俄亥俄州辛辛那提为例-您有一个标记为“城市”的字段,另一字段称为“州”,其中“辛辛那提”位于一列,而俄亥俄州则在另一列。俄亥俄州的辛辛那提市将相当普遍,但亚利桑那州的辛辛那提市却很少见。在此功能之前,PostgreSQL仅记录了多个列的单个相关值。从本质上讲,它将俄亥俄州的辛辛那提和亚利桑那州的辛辛那提视为同一件事。现在,您可以比较多个列并关联组合以优化查询索引。

4.公用表表达式(CTE)

正确实现的另一个过期功能是通用表表达式(带有查询内联)。公用表表达式充当优化障碍,公用表表达式中的查询首先执行,然后PostgreSQL将在查询中执行之后的任何操作。一些用户采用通用表表达式来提高SQL的可读性和调试,而不是优化SQL的执行。这些用户不可避免地会遇到优化行为。PostgreSQL 12使用关键字“MATERIALIZE”实现了一项新功能,该功能允许用户打开优化围栏。如果您不使用MATERIALIZE,则不会获得优化范围,并且可能会看到更快的查询。

5.准备好的计划控制

一项重要的新功能使用户可以控制PostgreSQL优化器的行为,并有可能提高性能。早期版本的PostgreSQL将使用自定义计划五次,第六次创建一个通用计划,并在与自定义计划一样好的情况下使用它。现在,可以通过名为“plan_cache_mode”的新变量手动控制此行为,该变量允许用户立即强制执行通用计划。这为那些知道其参数恒定并且知道通用计划将起作用的用户带来了显着的性能优势。

6.即时编译

PostgreSQL 11最初引入的一项功能是现在在PostgreSQL 12中默认启用即时复杂功能。即时编译允许处理大量数据的数据仓库查询来更有效地运行执行程序。由于许多用户启用了此功能,因此该功能现已成为PostgreSQL 12的默认功能。

7.校验和控制

追溯到2013年,PostgreSQL引入了一种校验和功能,用于识别数据损坏。首次初始化数据库时必须打开此功能,否则用户必须转储,打开该功能并重新加载数据。这使得某些用户几乎无法使用该功能。在PostgreSQL 12中,通过一个称为“pg checksums”的命令(以前称为pg verify checksum),用户可以在不转储和重新加载数据的情况下将群集从无校验和更改为校验和。当前,在此更改期间,群集必须处于脱机状态,但是正在开发联机校验和支持。

8.并发重新编制索引

索引并发功能已经存在多年,允许用户创建索引而又不阻止写入索引。重新索引不允许您在写入数据库时创建索引,同时使用reindex,通过在同一位置创建新索引来替换现有索引。同时使用Reindex可以写入索引并保留原始索引名称。显然,当替换索引时,最小的锁定将发生,直到实现替换为止。长期以来要求的功能很难开发,但最终在PostgreSQL 12中交付。


升级到PostgreSQL 12

这八个功能只是PostgreSQL 12中许多改进中的几个。从分区改进到公用表表达式的实现,PostgreSQL 12提供了显着的可用性增强,将使许多新用户和长期用户满意。


浏览完整的全部新特性或是改进功能列表,请参阅此处。亦可参考官方发布公告