PostgreSQL 13 正式发布


PostgreSQL 13 已于2020年9月25日正式发布,新版本对索引和查找系统进行了重大改进,大型数据库因此受益甚多,包括节省了空间并提高了索引的性能,使用聚合或分区的查询的响应时间更快,使用增强的统计信息时更好的查询计划(query planning)等。
除了并行化清理(parallelized vacuuming)和增量排序(incremental sorting)等呼声较高的功能外,PostgreSQL 13 还为大大小小的工作负载提供了更好的数据管理体验,并对日常管理进行了优化,为应用开发者提供了更多便利,并增强了安全性。
性能提升
在先前 PostgreSQL 版本的基础上,PostgreSQL 13 可以有效地处理 B 树索引(PostgreSQL 的标准索引)中的重复数据,从而降低 B 树索引所需的整体空间使用率,同时提高了整体查询性能。
PostgreSQL 13 引入了增量排序,即在查询中较早步骤的排序数据可以加速后面步骤的排序。此外,PostgreSQL 现在可以使用扩展的统计信息(可通过CREATE STATISTICS访问)来为带有OR子句和IN/ANY查找列表的查询创建改进的计划。在 PostgreSQL 13 中,更多类型的聚合查询和分组查询可以利用 PostgreSQL 的高效哈希聚合功能,因为具有大型聚合的查询不必完全放入内存。对分区表的查询也得到了性能提升,因为现在有更多的情况下可以修剪分区和直接联接分区。
优化管理
清理(Vacuuming)是 PostgreSQL 管理的一个重要部分,使数据库在更新和删除行后能够回收存储空间。此过程也会带来管理上的挑战,尽管之前的 PostgreSQL 版本已经做了一些工作来减轻清理的开销。
PostgreSQL 13 通过引入用于索引的并行化清理来继续改进清理系统 。具体来说,VACUUM 命令能够并行处理索引。可以使用 VACUUM 命令上的新 PARALLEL 选项(或 vacuumdb 上的 --parallel)来访问其功能,该选项允许用户指定用于清理索引的并行 Worker 进程的数量。要注意的是,这不适用于 FULL 选项。由于管理员可以选择要运行的并行 Worker 进程的数量,因此可以针对特定的工作负载调整此新功能的使用。除了这些性能优势之外,数据插入现在还可以触发自动清理过程。
复制插槽(Replication slots),用于防止在复制副本接收到预写日志(WAL, write-ahead logs)之前将其删除,现在可在 PostgreSQL 13 中进行调整,以指定要保留的 WAL 文件的最大数量,有助于避免磁盘空间不足错误。
PostgreSQL 13 还增加了更多让管理员可以监控数据库活动的方法,包括从 EXPLAIN 中查看 WAL 使用情况的统计信息、流式基础备份的进度,以及 ANALYZE 命令的进度。此外,可以使用新的 pg_verifybackup 命令验证 pg_basebackup 命令输出的完整性。
应用开发
PostgreSQL 13 对来自不同数据源的 PostgreSQL 数据类型进行了优化。此版本在其 SQL/JSON 路径支持中增加了datetime()函数,它可以将有效的时间格式(如 ISO 8601 字符串)转换为 PostgreSQL 原生类型。此外,UUID v4 生成函数 gen_random_uuid() 现在无需安装任何扩展即可使用。
PostgreSQL 分区系统更加灵活,因为分区表完全支持逻辑复制和 BEFORE 行级触发器。
PostgreSQL 13 中的FETCH FIRST语法现已扩展为可包含WITH TIES子句。 指定时,WITH TIES包括基于ORDER BY子句的结果集中最后一行相匹配的任何其他行。
安全性增强
在之前的版本中,新扩展只能由数据库超级用户安装。为了更容易利用 PostgreSQL 的扩展性,PostgreSQL 13 增加了“可信扩展”的概念——允许数据库用户安装超级用户标记为“可信”的扩展。某些内置扩展默认被标记为“可信”,包括pgcrypto, tablefunc和hstore等。
对于需要安全认证方法的应用,PostgreSQL 13 允许客户端在使用 SCRAM 身份认证时要求通道绑定,并且 PostgreSQL 外部数据包装器(postgres_fdw)现在可以使用基于证书的认证。
更多详情查看发行公告。
最新的13.2版本相较于12版本,新版本在与监视有关的方面作了许多的改进。比如增加了一些新的视图(view),同时对已有的某些视图添加了些新的字段。下面是“PostgreSQL 13.2可观察性”图。

而下图则是PostgreSQL 12版本的“可观察性”图。

从PostgreSQL 12与13两个版本的“可观察性”图对照得知,共增加了四个视图(除此之外,其他改进都是通用的,与现有视图相关),它们分别是:
pg_stat_progress_basebackup
pg_stat_progress_analyze
pg_shmen_allocations
pg_stat_slru
进度列表视图已经扩展为两个新视图,即:pg_stat_progress_basebackup, pg_stat_progress_analyze。
对于视图pg_stat_progress_basebackup,它有助于观察正在运行基本备份并估计其进度、ETA和其他属性。而视图pg_stat_progress_analyze,它监视执行/分析操作。对于视图pg_shmen_allocations,将用于更深入地检查如何使用共享缓冲区。视图pg_stat_slru,它与检查SLRU缓存有关。
pg_stat_statements的一些修改:
添加了与时间计划相关的新字段,因此现有的“time”字段已被重命名为executing time。故所有依赖pg_stat_statements的监视工具都应该进行相应的调整。
添加了与WAL相关的新字段——现在可以了解每条语句产生了多少WAL,WAL使用情况统计信息也已经添加到EXPLAIN(增加了WAL关键字)、auto_explain和autovacuum中,WAL使用情况统计信息将附加到日志中(即如果启用了log_autovacuum_min_duration)。
pg_stat_activity有一个新的列leader_pid,它显示并行组leader的PID,并帮助显式地识别后台worker和它们的leader。
除了并行化清理(parallelized vacuuming)和增量排序(incremental sorting)等呼声较高的功能外,PostgreSQL 13 还为大大小小的工作负载提供了更好的数据管理体验,并对日常管理进行了优化,为应用开发者提供了更多便利,并增强了安全性。
性能提升
在先前 PostgreSQL 版本的基础上,PostgreSQL 13 可以有效地处理 B 树索引(PostgreSQL 的标准索引)中的重复数据,从而降低 B 树索引所需的整体空间使用率,同时提高了整体查询性能。
PostgreSQL 13 引入了增量排序,即在查询中较早步骤的排序数据可以加速后面步骤的排序。此外,PostgreSQL 现在可以使用扩展的统计信息(可通过CREATE STATISTICS访问)来为带有OR子句和IN/ANY查找列表的查询创建改进的计划。在 PostgreSQL 13 中,更多类型的聚合查询和分组查询可以利用 PostgreSQL 的高效哈希聚合功能,因为具有大型聚合的查询不必完全放入内存。对分区表的查询也得到了性能提升,因为现在有更多的情况下可以修剪分区和直接联接分区。
优化管理
清理(Vacuuming)是 PostgreSQL 管理的一个重要部分,使数据库在更新和删除行后能够回收存储空间。此过程也会带来管理上的挑战,尽管之前的 PostgreSQL 版本已经做了一些工作来减轻清理的开销。
PostgreSQL 13 通过引入用于索引的并行化清理来继续改进清理系统 。具体来说,VACUUM 命令能够并行处理索引。可以使用 VACUUM 命令上的新 PARALLEL 选项(或 vacuumdb 上的 --parallel)来访问其功能,该选项允许用户指定用于清理索引的并行 Worker 进程的数量。要注意的是,这不适用于 FULL 选项。由于管理员可以选择要运行的并行 Worker 进程的数量,因此可以针对特定的工作负载调整此新功能的使用。除了这些性能优势之外,数据插入现在还可以触发自动清理过程。
复制插槽(Replication slots),用于防止在复制副本接收到预写日志(WAL, write-ahead logs)之前将其删除,现在可在 PostgreSQL 13 中进行调整,以指定要保留的 WAL 文件的最大数量,有助于避免磁盘空间不足错误。
PostgreSQL 13 还增加了更多让管理员可以监控数据库活动的方法,包括从 EXPLAIN 中查看 WAL 使用情况的统计信息、流式基础备份的进度,以及 ANALYZE 命令的进度。此外,可以使用新的 pg_verifybackup 命令验证 pg_basebackup 命令输出的完整性。
应用开发
PostgreSQL 13 对来自不同数据源的 PostgreSQL 数据类型进行了优化。此版本在其 SQL/JSON 路径支持中增加了datetime()函数,它可以将有效的时间格式(如 ISO 8601 字符串)转换为 PostgreSQL 原生类型。此外,UUID v4 生成函数 gen_random_uuid() 现在无需安装任何扩展即可使用。
PostgreSQL 分区系统更加灵活,因为分区表完全支持逻辑复制和 BEFORE 行级触发器。
PostgreSQL 13 中的FETCH FIRST语法现已扩展为可包含WITH TIES子句。 指定时,WITH TIES包括基于ORDER BY子句的结果集中最后一行相匹配的任何其他行。
安全性增强
在之前的版本中,新扩展只能由数据库超级用户安装。为了更容易利用 PostgreSQL 的扩展性,PostgreSQL 13 增加了“可信扩展”的概念——允许数据库用户安装超级用户标记为“可信”的扩展。某些内置扩展默认被标记为“可信”,包括pgcrypto, tablefunc和hstore等。
对于需要安全认证方法的应用,PostgreSQL 13 允许客户端在使用 SCRAM 身份认证时要求通道绑定,并且 PostgreSQL 外部数据包装器(postgres_fdw)现在可以使用基于证书的认证。
更多详情查看发行公告。
最新的13.2版本相较于12版本,新版本在与监视有关的方面作了许多的改进。比如增加了一些新的视图(view),同时对已有的某些视图添加了些新的字段。下面是“PostgreSQL 13.2可观察性”图。

而下图则是PostgreSQL 12版本的“可观察性”图。

从PostgreSQL 12与13两个版本的“可观察性”图对照得知,共增加了四个视图(除此之外,其他改进都是通用的,与现有视图相关),它们分别是:
pg_stat_progress_basebackup
pg_stat_progress_analyze
pg_shmen_allocations
pg_stat_slru
进度列表视图已经扩展为两个新视图,即:pg_stat_progress_basebackup, pg_stat_progress_analyze。
对于视图pg_stat_progress_basebackup,它有助于观察正在运行基本备份并估计其进度、ETA和其他属性。而视图pg_stat_progress_analyze,它监视执行/分析操作。对于视图pg_shmen_allocations,将用于更深入地检查如何使用共享缓冲区。视图pg_stat_slru,它与检查SLRU缓存有关。
pg_stat_statements的一些修改:
添加了与时间计划相关的新字段,因此现有的“time”字段已被重命名为executing time。故所有依赖pg_stat_statements的监视工具都应该进行相应的调整。
添加了与WAL相关的新字段——现在可以了解每条语句产生了多少WAL,WAL使用情况统计信息也已经添加到EXPLAIN(增加了WAL关键字)、auto_explain和autovacuum中,WAL使用情况统计信息将附加到日志中(即如果启用了log_autovacuum_min_duration)。
pg_stat_activity有一个新的列leader_pid,它显示并行组leader的PID,并帮助显式地识别后台worker和它们的leader。