PostgreSQL 全球开发小组宣布,PostgreSQL 12 的第一个 beta 版本现已可供下载。此版本包含 PostgreSQL 12 最终版本中将提供的所有功能的预览,尽管在最终版本之前,某些细节可能会发生变化。
秉承开源 PostgreSQL 社区的精神,我们强烈建议您在数据库系统中测试 PostgreSQL 12 的新功能,以帮助我们消除可能存在的任何错误或其他问题。虽然我们不建议您在生产环境中使用 PostgreSQL 12 Beta 1,但我们鼓励您找到方法针对此 beta 版本运行您的典型应用程序工作负载。
您的测试和反馈将帮助社区确保 PostgreSQL 12 版本符合我们提供世界上最先进的开源关系数据库的稳定、可靠版本的标准。
PostgreSQL 12 改进了标准 B 树索引的整体性能,并改进了这些索引的空间管理。这些改进还减少了频繁修改的 B 树索引的索引大小,并提高了性能。
此外,PostgreSQL 12 添加了并发重建索引的能力,允许您执行 REINDEX
操作,而不会阻止对索引的任何写入。此功能应有助于解决在生产环境中管理 PostgreSQL 数据库时可能导致停机的长时间索引重建问题。
PostgreSQL 12 扩展了几个专用索引机制的能力。创建覆盖索引的能力,即 PostgreSQL 11 中引入的 INCLUDE
子句,现在已添加到 GiST 索引中。SP-GiST 索引现在支持对支持距离 (<->
) 操作的数据类型执行 K 最近邻 (K-NN) 查询的能力。
在 PostgreSQL 12 中,创建 GiST、GIN 或 SP-GiST 索引时生成的预写日志 (WAL) 开销也显着减少,这为 PostgreSQL 集群的磁盘利用率和持续归档和流复制等功能带来了好处。
如果公共表表达式(又名 WITH
查询)a)不是递归的,b)没有任何副作用,并且 c)在查询的后续部分中只被引用一次,则现在可以自动将其内联到查询中。这消除了自 PostgreSQL 8.4 中引入 WITH
子句以来一直存在的“优化屏障”。
如果需要,您可以使用 MATERIALIZED
子句强制 WITH
查询实体化,例如:
WITH c AS MATERIALIZED ( SELECT * FROM a WHERE a.x % 4 = 0 ) SELECT * FROM c JOIN d ON d.y = a.x;
PostgreSQL 12 改进了在处理仅需要使用少量分区的数千个分区表时的性能。
PostgreSQL 12 还改进了 INSERT
和 COPY
到分区表的性能。现在可以在不阻止对分区表的并发查询的情况下执行 ATTACH PARTITION
。此外,在 PostgreSQL 12 中允许使用外键引用分区表。
PostgreSQL 12 现在允许根据 SQL:2016 标准执行 JSON 路径查询。类似于 XML 的 XPath 表达式,JSON 路径表达式允许您评估各种算术表达式和函数,以及比较 JSON 文档中的值。
可以使用 GIN 索引加速这些表达式的子集,从而允许对 JSON 数据集执行高性能查找。
PostgreSQL 12 现在支持 ICU 提供的排序规则的不区分大小写和不区分重音的比较,也称为“非确定性排序规则”。使用时,这些排序规则可以为比较和排序提供便利,但也可能导致性能损失,因为排序规则可能需要对字符串进行额外的检查。
CREATE STATISTICS
,在 PostgreSQL 10 中引入,用于收集多个列的更复杂统计信息以改进查询计划,现在支持最常见值统计信息。这可以改进非均匀分布的查询计划。
PostgreSQL 12 允许创建生成列,这些列使用其他列的内容通过表达式计算其值。此功能提供存储的生成列,这些列在插入和更新时计算,并保存在磁盘上。虚拟生成列(仅当在查询中读取列时才计算)尚未实现。
PostgreSQL 12 引入了可插拔表存储接口,该接口允许创建和使用不同的表存储方法。可以使用 CREATE ACCESS METHOD
命令将新的访问方法添加到 PostgreSQL 集群,然后使用 CREATE TABLE
上的新 USING
子句添加到表中。
可以通过创建新的表访问方法来定义表存储接口。
在 PostgreSQL 12 中,默认使用的存储接口是 heap
访问方法,它目前是唯一的内置方法。
pg_verify_checkums
命令已重命名为 pg_checksums
,现在支持在离线 PostgreSQL 集群中启用和禁用页面校验和。以前,只能在初始化带有 initdb
的集群期间启用页面校验和。
GSSAPI 现在支持客户端和服务器端加密,并且可以在 pg_hba.conf
文件中使用 hostgssenc
和 hostnogssenc
记录类型指定。如果 PostgreSQL 是使用 OpenLDAP 编译的,则 PostgreSQL 12 还允许根据 DNS SRV
记录发现 LDAP 服务器。
PostgreSQL 12 中引入了一些可能会影响行为以及正在进行的运营管理更改。下面列出了一些更改;有关其他更改的信息,请查看发行说明的“迁移到版本 12”部分。
recovery.conf
配置文件现在已合并到主 postgresql.conf
文件中。如果 PostgreSQL 检测到存在 recovery.conf
,则不会启动。要将 PostgreSQL 置于非主模式,可以使用 recovery.signal
和 standby.signal
文件。您可以在此处阅读有关归档恢复的更多信息
https://postgresql.ac.cn/docs/12/runtime-config-wal.html#RUNTIME-CONFIG-WAL-ARCHIVE-RECOVERY
默认情况下,现在启用即时 (JIT) 编译。
不再允许使用 WITH OIDs
子句将 OID 添加到用户创建的表中。需要调整对使用 WITH OIDS
创建的列(即名为“OID”的列)的表的操作。
在系统表上运行 SELECT *
命令现在还将输出系统表中行的 OID,而不是旧的行为,旧的行为需要显式指定 OID 列。
PostgreSQL 12 中添加了许多其他新功能和改进,其中一些功能对于特定用户可能与上述功能一样重要甚至更重要。请参阅发行说明,以获取新的和更改的功能的完整列表。
每个 PostgreSQL 版本的稳定性在很大程度上取决于您,即社区,在 PostgreSQL 12 正式发布之前,使用您的工作负载和测试工具测试即将到来的版本,以便找到错误和回归。由于这是一个 Beta 版本,数据库行为、功能细节和 API 的细微更改仍然是可能的。您的反馈和测试将有助于确定新功能的最终调整,因此请在近期进行测试。用户测试的质量有助于确定何时可以进行最终版本发布。
PostgreSQL wiki 中公开提供了未解决的问题列表。您可以使用 PostgreSQL 网站上的此表格报告错误。
https://postgresql.ac.cn/account/submitbug/
这是版本 12 的第一个 beta 版本。PostgreSQL 项目将根据需要发布其他 beta 版本以进行测试,然后发布一个或多个候选版本,直到 2019 年底的最终版本。有关更多信息,请参阅Beta 测试页面。