PostgreSQL 12专注于性能和优化。此版本的发布并未考虑到全新的闪亮功能;相反,它是对现有PostgreSQL功能的微调和精心设计的实现。因为PostgreSQL每年都会发布新版本,所以并不是每一个新功能都完全具备。在发布了几个版本之后,当该功能有机会从其最初的实现中发展出来时,其性能将得到改善,边缘情况将得到支持,缺失的功能将得到实现。
这是PostgreSQL 12中发现的八个最重要的改进。
分区并不是一项新功能,它已经存在了好几年了,但是分区开销却降低了性能。PostgreSQL 11引入了一些分区性能改进,而PostgreSQL 12提供了完善的实现。对于从具有数千个分区的其他数据库迁移来的用户,PostgreSQL 12现在通过提供可同时有效处理数千个分区的功能而带来性能优势。分区性能增强可以提高查询性能,尤其是INSERT和COPY语句的性能。此外,用户现在可以更改分区表而不会阻止查询,并可以使用外键引用分区表。
B-Tree功能是近年来对PostgreSQL添加的最复杂的功能之一。使用B树的好处是减少了访问的磁盘块的数量。考虑到B-Tree技术可以追溯到1970年代,很难对已经存在数十年的可靠功能进行改进。但是PostgreSQL 12团队致力于提供可自动启用的重大性能改进,旨在避免某些极端情况和B树代码中曾经存在的“病理行为”。现在,通过更有效地利用空间,多列索引大小最多可减少40%,从而节省了磁盘空间。具有重复项(非唯一B树索引)的索引的性能得以提高,并且从索引中删除元组(行)的真空运行效率更高。此外,索引更新期间的锁定要求有所降低。
此更新已经进行了几年的开发,旨在解决多年来引起投诉的问题:查询中相关列的边缘情况。以俄亥俄州辛辛那提为例-您有一个标记为“城市”的字段,另一字段称为“州”,其中“辛辛那提”位于一列,而俄亥俄州则在另一列。俄亥俄州的辛辛那提市将相当普遍,但亚利桑那州的辛辛那提市却很少见。在此功能之前,PostgreSQL仅记录了多个列的单个相关值。从本质上讲,它将俄亥俄州的辛辛那提和亚利桑那州的辛辛那提视为同一件事。现在,您可以比较多个列并关联组合以优化查询索引。
正确实现的另一个过期功能是通用表表达式(带有查询内联)。公用表表达式充当优化障碍,公用表表达式中的查询首先执行,然后PostgreSQL将在查询中执行之后的任何操作。一些用户采用通用表表达式来提高SQL的可读性和调试,而不是优化SQL的执行。这些用户不可避免地会遇到优化行为。PostgreSQL 12使用关键字“ MATERIALIZE”实现了一项新功能,该功能允许用户打开优化围栏。如果您不使用MATERIALIZE,则不会获得优化范围,并且可能会看到更快的查询。
一项重要的新功能使用户可以控制PostgreSQL优化器的行为,并有可能提高性能。早期版本的PostgreSQL将使用自定义计划五次,第六次创建一个通用计划,并在与自定义计划一样好的情况下使用它。现在,可以通过名为“ plan_cache_mode”的新变量手动控制此行为,该变量允许用户立即强制执行通用计划。这为那些知道其参数恒定并且知道通用计划将起作用的用户带来了显着的性能优势。
PostgreSQL 11最初引入的一项功能是现在在PostgreSQL 12中默认启用即时复杂功能。即时编译允许处理大量数据的数据仓库查询来更有效地运行执行程序。由于许多用户启用了此功能,因此该功能现已成为PostgreSQL 12的默认功能。
追溯到2013年,PostgreSQL引入了一种校验和功能,用于识别数据损坏。首次初始化数据库时必须打开此功能,否则用户必须转储,打开该功能并重新加载数据。这使得某些用户几乎无法使用该功能。在PostgreSQL 12中,通过一个称为“ pg checksums”的命令(以前称为pg verify checksum),用户可以在不转储和重新加载数据的情况下将群集从无校验和更改为校验和。当前,在此更改期间,群集必须处于脱机状态,但是正在开发联机校验和支持。
索引并发功能已经存在多年,允许用户创建索引而又不阻止写入索引。重新索引不允许您在写入数据库时创建索引。同时使用reindex,通过在同一位置创建新索引来替换现有索引。同时使用Reindex可以写入索引并保留原始索引名称。显然,当替换索引时,最小的锁定将发生,直到实现替换为止。长期以来要求的功能很难开发,但最终在PostgreSQL 12中交付。
这八个功能只是PostgreSQL 12中许多改进中的几个。从分区改进到公用表表达式的实现,PostgreSQL 12提供了显着的可用性增强,将使许多新用户和长期用户满意。
Postgres已成为数据库领域的巨头。根据2019年Stack Overflow对近90,000名开发人员的调查,Postgres的部署现在比SQL Server部署得更为普遍。