PostgreSQL 1x Beta 版本特性
2019-05-24 14:58:57 阿炯

本文用于记录PostgreSQL Beta版本的相关信息,限于第10至19版本之间。


PostgreSQL 12 beta 1 发布了,此版本包含了 PostgreSQL 12 最终版本中可用的所有功能的预览,但某些细节可能会在 12 正式发布之前发生变化。新特性包括:

索引性能、功能和管理
PostgreSQL 12 改进了标准 B 树索引的整体性能,同时改进了这些索引的空间管理。除了性能提升之外,这些改进还减少了需要经常修改的 B 树索引的大小。此外,12版还增加了并发重建索引的功能,这使得可以在不阻止对索引进行任何写入的情况下执行 REINDEX 操作。此功能应该有助于在生产环境中管理 PostgreSQL 数据库时可能导致停机的冗长索引重建。PostgreSQL 12 扩展了几种专用索引机制的功能。创建覆盖索引的能力,即 PostgreSQL 11 中引入的 INCLUDE 子句,现已添加到 GiST 索引中。SP-GiST 索引现在支持对支持距离(<->)操作的数据类型执行 K 近邻(K-NN)查询的能力。创建 GiST、GIN 或 SP-GiST 索引时生成的预写日志(WAL)开销量在第12版中也显着降低,这提高了 PostgreSQL 集群的磁盘利用率,同时为连续存档与流复制等功能提供了多种好处。

内联 WITH 查询(公用表表达式)
公共表表达式(也称为 WITH 查询)现在满足以下几个条件则可以在查询中自动内联:
不是递归的
没有任何副作用
仅在查询的后续部分引用一次

这将删除 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;

分区
在处理具有数千个分区的表时,性能提高了,并且只需要使用少量分区操作,还改进了 INSERT 和 COPY 在分区表中的性能。现在可以在不阻塞分区表上的并发查询的情况下执行 ATTACH PARTITION,允许使用外键来引用分区表。

SQL/JSON 的 JSON 路径查询规范
现在允许根据 SQL:2016 标准中的 SQL/JSON 规范执行 JSON 路径查询。与 XML 的 XPath 表达式类似,除了比较 JSON 文档中的值之外,JSON 路径表达式还允许评估各种算术表达式和函数。可以使用 GIN 索引加速这些表达式的子集,从而允许跨多组 JSON 数据执行高性能查找。

排序规则
现在支持对 ICU 提供的排序规则进行不区分大小写和重音不敏感的比较,也称为“非确定性排序规则”。使用时,这些排序规则可以为比较和排序提供便利,但也可能导致性能损失,因为排序规则可能需要对字符串进行额外检查。

可插拔表存储接口
引入了可插入表存储接口,允许创建和使用不同的表存储方法。可以使用 CREATE ACCESS METHOD 命令将新的访问方法添加到 PostgreSQL 集群,然后将其添加到 CREATE TABLE 上具有新 USING 子句的表中。可以通过创建新的表访问方法来定义表存储接口。在 PostgreSQL 12 中,默认使用的存储接口是堆访问方法,它目前是唯一的内置方法。

页面校验和
pg_verify_checkums 命令已重命名为 pg_checksums,现在支持在脱机的 PostgreSQL 集群中启用和禁用页面校验和的功能。

认证和连接安全
GSSAPI 现在支持客户端和服务器端加密,可以使用 hostgssenc 和 hostnogssenc 记录类型在 pg_hba.conf 文件中指定。如果使用 OpenLDAP 编译 PostgreSQL,PostgreSQL 12 还允许基于 DNS SRV 记录发现 LDAP 服务器。

详情查看更新说明

PostgreSQL 13 的第一个 Beta 版本在2020年5月底发布了,此版本更新包含多个亮:

功能性
有许多新功能可以帮助提高 PostgreSQL 的整体性能,同时使开发应用程序变得更加容易。B 树索引(PostgreSQL 的标准索引)在处理重复数据方面得到了改进。这些增强功能有助于缩小索引大小并提高查找速度,特别是对于包含重复值的索引。增加了增量排序,当从查询的早期部分排序的数据已经被排序时,它可以加速数据的排序。此外,带有 OR 子句或 IN/ANY 常量列表的查询可以使用扩展的统计信息(通过 CREATE STATISTICS 创建)。

在此发行版中,PostgreSQL 的分区功能增加了更多改进,包括增加了在分区表之间直接进行联接的情况,这可以缩短总体查询执行时间。分区表现在支持在行级触发器(row-level triggers)之前,并且分区表现在可以通过逻辑复制完全复制,而不必发布单个分区。为使用诸如 FETCH FIRST WITH TIES 之类的功能编写查询提供了更多便利,该功能返回与最后一行匹配的任何其他行。还为 jsonpath 查询添加了 .datetime() 函数,该函数将自动将类似日期或类似时间的字符串转换为适当的 PostgreSQL 日期/时间数据类型。现在生成随机 UUID 甚至更加容易,因为可以使用 gen_random_uuid() 函数而无需启用任何扩展。

可管理性
最令人期待的特性之一是 VACUUM 命令能够并行处理索引。可以使用 VACUUM 命令上的新 PARALLEL 选项(或 vacuumdb 上的 --parallel)来访问其功能,该选项允许用户指定用于清理索引的并行工作程序的数量。要注意的是,这不适用于 FULL 选项。reindexdb 命令还通过新的 --jobs 标志添加了并行性,它可以指定在为数据库重新索引时要使用的并发会话数。引入了“可信扩展”(trusted extension)的概念,该概念允许超级用户指定(只要具有 CREATE 特权就可以在其数据库中安装的)扩展。该版本包括更多监控 PostgreSQL 数据库中活动的方法:PostgreSQL 13 现在可以跟踪 WAL 使用情况统计信息、流式基础备份的进度,以及 ANALYZE 命令的进度。pg_basebackup 还可以生成一个清单,该清单可用于使用新工具 pg_verifybackup 来验证备份的完整性。现在也可以限制复制槽保留的 WAL 空间量。
pg_dump 的新标志 --include-foreign-data 在转储输出中包括来自外部数据包装程序引用的服务器数据。
pg_rewind 命令在第13版本中也有所改进。除了 pg_rewind 自动执行崩溃恢复外,现在可以使用 --write-recovery-conf 标志使用它来配置备用 PostgreSQL 实例。 pg_rewind 也可以使用目标实例的 restore_command 来获取所需的预写日志。

安全性
PostgreSQL 在此最新版本中继续改进安全功能,引入了一些功能来帮助进一步安全地部署 PostgreSQL。libpq 是为 psql 和许多 PostgreSQL 连接驱动程序提供动力的连接库,新版本带来了几个有助于保护连接的新参数。第13版本中引入了 channel_binding 连接参数,该参数允许客户端指定他们希望将通道绑定功能作为 SCRAM 的一部分。此外,使用密码保护的 TLS 证书的客户端现在可以使用 sslpassword 参数指定其密码。还增加了对 DER 编码证书的支持。外部数据包装器(postgres_fdw)还获得了一些如何保护连接安全的增强功能,包括使用基于证书的身份验证连接到其他 PostgreSQL 集群的能力。此外,无特权的帐户现在可以通过 postgres_fdw 连接到另一个 PostgreSQL 数据库,而无需使用密码。

其他
继续改善 Windows 的可操作性,现在在 Windows 上运行 PostgreSQL 的用户可以选择通过 UNIX 域套接字进行连接。文档增加了术语表,以帮助人们熟悉 PostgreSQL 和常规数据库概念。同时表中的函数和运算符的显示也进行了大量修改,这有助于提高 Web 和 PDF 文档的可读性。用于性能测试的 pgbench 实用程序现在支持对“帐户”表进行分区的功能,从而可以更轻松地对包含分区的工作负载进行基准测试。在输出数据方面,psql 包含了 \warn命令,该命令类似于 \echo 命令,只是 \warn 将其发送到 stderr。

更多参考请详见发行公告

PostgreSQL官方开发组于2021年5月20号正式发布了postgresql14 beta测试版本,来看看官方发布的新特性。

性能
①显著提升海量连接下数据库系统的事务吞吐率,不管这些连接是活动的还是空闲的。
②减少B-tree频繁更新造成的表膨胀。
③优化顺序扫描的并行查询,REFRESH MATERIALIZED VIEW支持并行。
④GiST索引在其构建过程中对数据进行预排序,从而可以更快地创建及减小索引大小。
⑤PostgreSQL FDW支持批量插入,并行查询,支持导入表分区,可以在外部表中支持truncate。
⑥分区表性能优化。
⑦增量排序可以用于窗口函数中。
⑦支持lz4压缩。

SQL语法
①支持多范围类型,例如一个不连续的范围区间。
②增加jsonb下标语法用于检索数据对象中的嵌套信息。
③存储过程支持out参数,并支持GROUP BY子句使用 DISTINCT关键字来去重。
④对于递归with查询新增了SEARCH和CYCLE语法。
⑤新增date_bin函数,可以将时间戳与指定的间隔对齐。

运维管理
①VACUUM性能提升,并针对索引进行了优化。Autovacuum支持分区表。ANALYZE性能提升,新增maintain_io_concurrency参数。
②新增pg_stat_progress_copy视图跟踪COPY的进度。
③新增pg_stat_wal视图跟踪WAL活动,并从pg_stat_replication_slots视图检查复制槽的统计数据。
④新增idle_session_timeout控制空闲连接超时时间,新增client_connection_check_interval 参数,它可以让 PostgreSQL在客户端断开连接时取消长查询。
⑤REINDEX支持分区表子分区索引。
⑥增加了pg_amcheck工具来检查数据损坏。

复制和恢复
①逻辑复制槽支持流式传输,这代表了事务会实时流向备库而不是等他们结束,这将大大提高逻辑复制的性能。
②新增 ADD/DROP PUBLICATION语法,使添加/删除变得更容易。
③优化崩溃恢复时的性能,可以在待机模式的PostgreSQL实例上使用pg_rewind。

安全
①新增pg_read_all_data和pg_write_all_data系统默认角色。
②默认使用sha256进行密码管理。
③可以在pg_hba.conf中使用证书的"区分名称"DN来进行基于证书的认证,并使用 clientname=DN 参数。

PostgreSQL 14 Beta 2 已于2021年7月2日发布。 PostgreSQL 的开发者持续改进这个流行的开源 SQL 数据库服务器,使其性能最大化。此版本包含将在第14版的最终版本中提供的所有功能的预览,不过在此之前版本的某些细节可能会发生变化。主要更新内容如下:
重新设计处理程序的输出参数
对 LZ4 对 toast 列的支持的各种改进和修复
支持通过 VACUUM 禁用索引旁路功能
在 pg_dumpall 中增加了 --no-toast-compression 功能
修复 libpq 在连接字符串中指定 hostaddr 时,SSL SNI 的崩溃问题
修复逻辑复制中多INSERT数据流时的断言故障
修复 pgbench 中 permute 函数的可移植性问题
修复 postgres_fdw 使用整行变量时失败的问题
修复 pg_stat_wal 的若干问题

更新公告1
更新公告2

PostgreSQL 15 的第一个 beta 版本现已于2022年5月下旬提供下载。其公告指出,此版本包含 PostgreSQL 15 普遍可用时将提供的所有功能的预览,但该版本的某些细节可能会在测试期间发生变化。本着开源 PostgreSQL 社区的精神,官方建议用户在系统上测试 PostgreSQL 15 的新功能,以帮助消除可能存在的错误或其他问题。虽然不建议用户在生产环境中运行 PostgreSQL 15 Beta 1,但其鼓励用户找到针对此 Beta 版本运行典型应用程序工作负载的方法。“您的测试和反馈将帮助社区确保 PostgreSQL 15 版本符合我们提供世界上最先进的开源关系数据库的稳定、可靠版本的标准”。

开发者体验
PostgreSQL 15 添加了用于简化和增强开发人员体验的新功能。此版本引入了MERGE,这是一个 SQL 标准命令,用于有条件地对数据执行写操作(INSERT、UPDATE或DELETE)。在此版本之前,同样的行为可以使用存储过程或在有限的基础上使用 INSERT ... ON CONFLICT来完成。“使用 PostgreSQL 15,开发人员可以编写简单、富有表现力的查询来选择要采取的适当数据修改操作。”

作为 9.2 版本的一部分,PostgreSQL 在 2012 年曾增加了对 JSON 的支持。五年后发布的 SQL/JSON 标准指定了用于访问和操作存储在关系数据库中的 JSON 数据的各种接口。PostgreSQL 15 在其现有的对 SQL/JSON 路径语言的支持的基础上,加入了更多标准的 SQL/JSON 函数。其中包括 SQL/JSON 构造函数、查询/自省函数,以及将 JSON 数据转换成 table 的能力。第15版增加了更多的正则表达式函数,包括regexp_count, regexp_instr, regexp_like, 和regexp_substr。range_agg 函数在 PostgreSQL 15 中引入,用于将 range数据类型聚合为multirange类型,现在也支持聚合multirange类型。

Performance
包括对较大数据集进行排序时对数据进行排序的显着加速,特别是超过work_mem参数的数据集。性能提升还扩展到了各种查询类型。包括为SELECT DISTINCT语句引入并行化,以及对使用 row_number()、rank() 和 count() 的 window functions 的性能改进。使用 PostgreSQL 外部数据包装器postgres_fdw来管理远程 PostgreSQL 服务器上的数据的应用程序,现在可以使 transactions 以并行方式提交。对于涉及带有分区的表的查询,也一些性能增强。用于存储大于单页 (8kB) 的数据的 PostgreSQL 系统和 TOAST tables 现在可以利用利用重复索引,并从更小的索引和更快的查找中获益。用于批量加载数据的 psql \copy 命令在第15版本中也有性能改进。

Backups、Archiving 和 Compression
第15版为各种组件增加了对 Zstandard(zstd)压缩的支持。pg_basebackup,一个用于对 PostgreSQL 集群进行完整备份的实用程序,现在支持使用 Gzip、LZ4 或 Zstandard 压缩的服务器端压缩。pg_basebackup客户端现在还可以解压缩使用 LZ4 和 Zstandard 压缩的备份。Write-ahead log (WAL) 文件现在可以通过wal_compression配置参数使用 LZ4 和 Zstandard 压缩法进行压缩。此外,PostgreSQL 15 还添加了recovery_prefetch选项,可以通过预取数据块来帮助加快恢复操作。此版本添加了一个叫做pg_walinspect的新模块,让你可以直接从 SQL 检查有关 WAL 文件的信息。允许你通过指定一个archive_library来执行 WAL 归档,而不需要运行 shell 命令。可以在basic_archive模块中找到示例 WAL 归档库。此外,扩展现在可以定义自己的 WAL 资源管理器,让他们与逻辑复制一起使用。

Logical Replication
为逻辑复制引入了 row filtering 和 column filtering 。此外用户现在可以方便地指定发布模式中的所有 tables,而以前只能对数据库中的所有 tables 执行此操作。还增加了对处理冲突的更多支持。用户现在可以指定disable_on_error,以便在发生错误时自动停止逻辑复制。可以使用 ALTER SUBSCRIPTION ... SKIP 命令跳过 applying changes。

Administration
引入了 jsonlog日志格式。这允许 PostgreSQL 日志被许多执行结构化日志聚合和分析的程序使用。第15版现在默认记录缓慢的 checkpoints 和 autovacuum operations。psql客户端现在有一个\dconfig命令,用于检查配置参数的值。默认情况下,\dconfig显示任何未设置为其默认值的配置参数。现在将所有服务器级别的统计信息存储在共享内存中,服务器不再运行 statistics collector process。ALTER TABLE 命令现在可以修改 table 的ACCESS METHOD,用于设置 table 使用的存储系统。

Security
在 PostgreSQL 集群中创建数据库时引入了新的默认值。创建新数据库时,数据库所有者之外的用户(由pg_database_owner表示)和超级用户不能再在默认public模式中创建对象。增加了对“security invoker views”的支持,它使用执行查询的用户而不是创建视图的用户的权限。非特权用户现在可以通过SET和ALTER SYSTEM被授予更改服务器变量的特权。

有关新功能和更改功能的完整列表可查看发行说明

Percona博客所总结的PostgreSQL 15相关更新

摘要:之前的统计信息收集器通过UDP接收统计信息更新,并通过定期将统计信息数据写出到临时文件来共享统计信息数据。当文件达到数十兆字节时,每秒最多写出两次,这会阻止添加其他有用的统计数据。现在PostgreSQL 15将做出了重大的改变,开始使用动态共享内存来收集统计信息,而不再使用文件和文件系统。
作者 | Jobin Augustine
译者 | 朱珂欣,责编 | 屠敏
出品 | CSDN(ID:CSDNnews)

众所周知,PostgreSQL是一个功能强大的开源对象关系数据库系统,它使用并扩展了SQL语言,并结合了许多可安全存储和扩展最复杂数据工作负载的特性。一直以来,PostgreSQL都在业内拥有极高的声誉,它的每一次版本的发布,都能在国内外获得很大的关注度。2022年6月30日,PostgreSQL全球开发组宣布PostgreSQL 15的第二个beta版本已可供下载,该版本包含将于2022年末发布的第15正式版本中的所有特性和功能。很多人将PostgreSQL 15与PostgreSQL 14相比较,就会发现有一个特别的更新——"统计信息收集器"不见了。曾经是无数开发者的开发瓶颈,如今已经永远消失了。作为PostgreSQL 14和更早版本都需要“统计信息收集器”,它存在怎样的问题呢,第15版本中又新增了什么样的功能?

PostgreSQL 15进程一览
postgres    1710       1  0 04:03 ?        00:00:00 /usr/pgsql-15/bin/postmaster -D /var/lib/pgsql/15/data/
postgres    1711    1710  0 04:03 ?        00:00:00 postgres: logger
postgres    1712    1710  0 04:03 ?        00:00:00 postgres: checkpointer
postgres    1713    1710  0 04:03 ?        00:00:00 postgres: background writer
postgres    1715    1710  0 04:03 ?        00:00:00 postgres: walwriter
postgres    1716    1710  0 04:03 ?        00:00:00 postgres: autovacuum launcher
postgres    1717    1710  0 04:03 ?        00:00:00 postgres: logical replication launcher

PostgreSQL 14进程一览
postgres    1751       1  0 04:04 ?        00:00:00 /usr/pgsql-14/bin/postmaster -D /var/lib/pgsql/14/data/
postgres    1752    1751  0 04:04 ?        00:00:00 postgres: logger
postgres    1754    1751  0 04:04 ?        00:00:00 postgres: checkpointer
postgres    1755    1751  0 04:04 ?        00:00:00 postgres: background writer
postgres    1756    1751  0 04:04 ?        00:00:00 postgres: walwriter
postgres    1757    1751  0 04:04 ?        00:00:00 postgres: autovacuum launcher
postgres    1758    1751  0 04:04 ?        00:00:00 postgres: stats collector
postgres    1759    1751  0 04:04 ?        00:00:00 postgres: logical replication launcher

被舍弃的统计信息收集器
PostgreSQL的统计信息收集器,是一个支持收集和报告服务器活动信息的子系统。它可以对表和索引的访问计数,以此累计统计信息。并且,还可以跟踪每个表中的总行数、每个表的清理和分析动作的信息,以及统计调用用户定义函数的次数和在每次调用中花费的总时间。但是,PostgreSQL的统计信息收集器同样存在一些问题。

信息传输受到阻力
由于会话的每个后端是PostgreSQL中的单独进程,因此,收集统计信息并传输并不是容易的事。每个后端将有关它们执行的活动信息发送到单个“统计信息收集器”进程。在过去,这种通信是通过UDP套接字进行,在用户报告的不同类型问题中显示,有三类问题较为明显:统计数据过期;统计数据收集器不运行;自动真空不工作/不启动等。并且,在过去如果统计数据收集器在特定机器上出现问题,用户其实很难理解出了什么问题。

大量IO出现
“统计信息收集器”还有一个不利影响——它引起的IO。如果启用DEBUG级别 2,可能会看到不断出现在PostgreSQL 日志中的消息,将导致数据目录所在的装入点上出现大量 IO。
2022-08-22 03:49:57.153 UTC [736] DEBUG:  received inquiry for database 0
2022-08-22 03:49:57.153 UTC [736] DEBUG:  writing stats file "pg_stat_tmp/global.stat"
2022-08-22 03:49:57.153 UTC [736] DEBUG:  writing stats file "pg_stat_tmp/db_0.stat"
2022-08-22 03:49:57.168 UTC [1278] DEBUG:  autovacuum: processing database "postgres"
2022-08-22 03:49:57.168 UTC [736] DEBUG:  received inquiry for database 13881
2022-08-22 03:49:57.168 UTC [736] DEBUG:  writing stats file "pg_stat_tmp/global.stat"
2022-08-22 03:49:57.168 UTC [736] DEBUG:  writing stats file "pg_stat_tmp/db_13881.stat"
2022-08-22 03:49:57.169 UTC [736] DEBUG:  writing stats file "pg_stat_tmp/db_0.stat"

下面是参数值stats_temp_directory所指向的位置。在许多系统上,它将是数据目录中pg_stat_tmp。在Ubuntu/Debian上,它将在/var/run/postgresql中,例如:
postgres=# show stats_temp_directory ;
stats_temp_directory           
-----------------------------------------
 /var/run/postgresql/14-main.pg_stat_tmp

PostgreSQL 15中的新动作

面对统计信息收集器带来的弊端,如今PostgreSQL 15开始使用动态共享内存来收集统计信息,而不再使用文件和文件系统。正如Andres Freund在文中提及的:以前,统计信息收集器通过UDP接收统计信息更新,并通过定期将统计信息数据写出到临时文件来共享统计信息数据。这些文件可以达到数十兆字节,并且每秒最多写出两次。这会阻止我们添加其他有用的统计数据。现在,统计信息都存储在共享内存中。可以变化的编号对象的统计信息,存储在由动态共享内存支持的 dshash 哈希表中。固定编号的统计信息,存储在普通共享内存中。pgstat.c 的标题包含体系结构的概述。不再需要统计信息收集器,请将其删除。

显然参数stats_temp_directory已经消失。因此不再需要pg_stat_tmp目录了,pg_stat_tmp目录是在数据目录或其他位置中创建的,所有统计文件都在此生成和读取。然而仍保留它是因为不会破坏许多依赖于该目录的扩展,例如pg_stat_statements。

在加载扩展库之前,目录保持为空。例如加载pg_stat_statements库,目录中会出现一个文件。
$ ls pg_stat_tmp/
pgss_query_texts.stat

当然这些扩展都并非无代价的,需要成本。在新架构中,大多数统计更新时,首先需要在每个进程中本地累积为"pending"(每个后端都有一个后端本地哈希表)。"pending"是指已累积但尚未提交到共享统计系统的待定信息。在提交后或超时后,会被刷入共享内存。由于统计信息是在有人试图读取时被并发更新的,所以读取一致性就成了问题。为了解决读取一致性的问题,在PostgreSQL 15中引入了一个新的参数:stats_fetch_consistency。它可以取三个值,none、cache 、snapshot:
“none”是最有效的。如果存在期望的监视查询,则无法提供读取一致性。但对于大多数使用来说是可以的。
“cache ”能确保重复访问产生相同的值,对于涉及自联接的查询很重要。
“snapshot”在以交互方式检查统计信息时很有用,但开销更高。
stats_fetch_consistency的默认值为“cache ”。

更新迭代中的疑问与解答

面对PostgreSQL 15新版本中的重大调整,很多用户也会产生相关的疑惑。

统计信息位于共享内存中,如何在重新启动后保存?
统计信息在关机前,由检查点进程写出到文件系统,并在启动期间由启动进程再次装回。像往常一样,如果发生崩溃,统计信息将会失效。

新功能会影响监控工具/脚本吗?
显然是不会,所有的统计监测视图pg_stat_*仍能照常工作,但需要为stats_fetch_consistency选择适当的值。如上所述,保留pg_stat_tmp目录是为了不破坏使用这种方法开发的扩展。但是,扩展开发人员需要针对PostgreSQL 15彻底测试扩展。

如何使用PostgreSQL等待事件来了解PostgreSQL及其会话在哪里花费的时间呢?
日常运行中使用的数据收集和分析工具,例如pg_gather,利用这些等待事件分析和了解问题。因此为了更好地监控,PostgreSQL还引入了三个新的等待事件:
PgStatsDSA:等待统计动态共享内存分配器访问。
PgStatsHash:等待stats共享内存哈希表访问。
PgStatsData:等待共享内存统计数据访问。

总的来说,PostgreSQL 15不再需要统计信息收集器,而是将统计信息都存储在共享内存中。随着统计收集器及其维护的所有开销的消失,其他子系统,例如自动真空系统,工作量将大大减少,经常查询统计信息的监控工具将会大大降低系统的负载。第15版的第二个候选版本已于2022年10月10日提供下载。公告指出,尽管在 PostgreSQL 15 全面可用之前可能会应用更多修复;但作为候选版本,RC 2 将与15版的初始版本基本相同。第15版的一般可用性计划日期仍然是2022年10月13日,但根据报告的问题可能会推迟到2022年10月20日。自 15 RC 1 以来进行了几项错误修复,包括有:
恢复了 “优化 GROUP BY keys 顺序” 的功能。
修复 psql 中的 \g 命令在多命令字符串中的行为。
修复单列排序中的内存泄漏。
修复 PQsslAttributelibpq 函数的行为。

更新公告1
更新公告2
更新公告3
更新公告4

PostgreSQL 16 的第一个测试版现已于2023年5月下旬对外发行。此版本包含其所有功能预览,但 beta 版本的某些细节可能会在测试期间发生变化。以下为第16版 beta 1 主要功能亮点:

性能优化
此版本为 x86 和 ARM 架构引入了对使用 SIMD 的 CPU 加速的支持,包括对处理 ASCII 和 JSON 字符串以及数组和子事务搜索的优化。此外 PostgreSQL 16 还为 PostgreSQL 的客户端库 libpq 引入了负载平衡。
PostgreSQL 16 包括查询执行方面的性能改进。此版本增加了更多查询并行性,包括允许并行执行 FULL 和 RIGHT 联接,以及并行执行 string_agg 和 array_agg 聚合函数。可以在 SELECT DISTINCT 查询中使用增量排序。还有一些针对窗口查询的优化, RANGE 和 LIST 分区查找的改进,以及对 RIGHT 和 OUTER 查询中 “反连接” 的支持。还可以将使用 COPY 并发批量加载数据的性能提高高达 300%。

逻辑复制增强
逻辑复制让 PostgreSQL 用户可以将数据实时流式传输到其他 PostgreSQL 或其他实现逻辑协议的外部系统。在 PostgreSQL 16 之前,用户只能在主实例上创建逻辑复制发布者。
PostgreSQL 16 增加了在备用实例上执行逻辑解码的能力,为用户提供了更多分配工作负载的选项,例如,使用比主实例繁忙的备用实例来逻辑复制更改。还包括对逻辑复制的多项性能改进。包括允许订阅者并行应用大型事务,使用 PRIMARY KEY 以外的索引在 UPDATE 或 DELETE 操作期间执行查找,并允许在初始化期间使用二进制格式复制表。

开发者体验
PostgreSQL 16 继续实施用于操作 JSON 数据的 SQL/JSON 标准,包括对 SQL/JSON 构造函数(例如 JSON_ARRAY() 、 JSON_ARRAYAGG() 等)和身份函数 ( IS JSON ) 的支持。
此版本还添加了 SQL 标准 ANY_VALUE 聚合函数,该函数返回聚合集中的任意值。为方便起见,PostgreSQL 16 现在允许指定非十进制整数文字,例如 0xff 、0o777 和 0b101010 ,并使用下划线作为千位分隔符,例如 5_432 。
此版本向 psql 客户端添加了对扩展查询协议的支持。用户可以执行查询,例如 SELECT $1 + $2 ,并使用 \bind 命令替换变量。

安全功能
PostgreSQL 16 继续让用户能够授予对功能的特权访问权限,而无需具有新预定义角色的超级用户。其中包括 pg_maintain ,它允许执行诸如 VACUUM 、 ANALYZE 、 REINDEX 等操作,以及 pg_create_subscription ,它允许用户创建逻辑复制订阅。此外,从这个版本开始,逻辑复制的订阅者作为表所有者而不是超级用户在表上执行事务。
PostgreSQL 16 现在允许在 pg_hba.conf 和 pg_ident.conf 文件中使用正则表达式来匹配用户名和数据库名。此外,PostgreSQL 16 添加了在 pg_hba.conf 和 pg_ident.conf 中包含其他文件的功能。
PostgreSQL 16 还增加了对 SQL 标准 SYSTEM_USER 关键字的支持,该关键字返回用于建立会话的用户名和身份验证方法。还增加了对 Kerberos 凭证委托的支持,它允许 postgres_fdw 和 dblink 等扩展使用经过身份验证的凭证连接到其他服务。
此版本还为客户端添加了几个新的面向安全的连接参数。包括 require_auth ,其中客户端可以指定它愿意从服务器接受哪些身份验证方法。现在可以将 sslrootcert 设置为 system ,以指示 PostgreSQL 使用客户端操作系统提供的受信任的证书颁发机构 (CA) 存储。

监控与管理
添加了几个新的监控功能,包括提供有关 I/O 统计信息的新 pg_stat_io 视图。此版本还提供了最后一次扫描表或索引的时间戳。用于 pg_stat_activity 的归一化算法也有改进。
此版本包括对页面冻结策略的改进,这有助于提高清理和其他维护操作的性能。
改进了对文本排序规则的一般支持,它提供了文本排序方式的规则。
PostgreSQL 16 将 ICU 设置为默认排序规则提供程序,还添加了对预定义的 unicode 和 ucs_basic 排序规则的支持。为 pg_dump 添加了额外的压缩选项,包括对 lz4 和 zstd 压缩的支持。

其他变化
PostgreSQL 16 删除了 promote_trigger_file 选项以启用对备用数据库的提升。引入了 Meson 构建系统,最终将取代 Autoconf。
启用 DirectIO 的开发人员标志,以及在订阅者中指定 origin=none 时使用逻辑复制在两个表之间进行双向复制的能力。
PostgreSQL 16 现在支持最低版本的 Windows 10。

具体详见 PostgreSQL 16 beta 发行公告,可在此文档中查看 PostgreSQL 16 的所有新功能

PostgreSQL 16 的第二个测试版现已于2023年7月上旬提供,此版本包含第16版的所有功能预览,但 beta 版本的某些细节可能会在测试期间发生变化。自 Beta 1 以来的变化中的修复和更改包括:
initdb 选择的默认 collation provider selected 被更改回了 libc。
用 libicu 选择 C 语言的行为被 deferred back 至 libicu。在 ICU 64 及更高版本上,C 语言已经过时了,ICU 提供了自己的机制来选择语言或抛出错误。
与连接优化相关的多个修复。
修复了 B-tree code 与从 standbys 逻辑解码引入的更改有关的问题。
修复了在 partition ancestors 上查找 MAINTAIN 权限时的缓存查找危险。

PostgreSQL 16 RC1 发布

PostgreSQL 全球开发组织于2023年8月未旬宣布第一个 PG 16 的候选版本现在可以下载了。作为发布候选版本,PostgreSQL 16 RC 1 将与 PostgreSQL 16 初始版本基本相同,尽管在常规之前可能会应用更多修复 PostgreSQL 16 的可用性。第 16 版本正式发布的计划日期是 2023 年 9 月 14 日,有关更多详细信息,请参阅 “发布时间表” 部分。

升级到 PostgreSQL 16 RC 1
要从早期 PostgreSQL 版本升级到 PostgreSQL 16 RC 1,需要使用类似于 pg_upgrade 或 pg_dump/pg_restore 的 PostgreSQL 主要版本之间升级的策略。有关详情请浏览升级文档

自 16 Beta 3 以来的变化
在 Beta 3 期间,PostgreSQL 16 应用了多个错误修复。这些包括:COPY 修复了在单个表上并发运行时的性能回归问题。

有关修复的详细列表请访问未结项目链接页面

发布时间表
这是 PostgreSQL 16 的第一个候选版本。除非问题是 发现需要延迟或产生额外的候选版本, PostgreSQL 16 应该在2023年9月14日正式发布。有关更多信息,请参阅 Beta 测试页面。