PostgreSQL 中文参考文档
🌐 英文原版 官方 ↗

E.6. 发布 18 #

E.6.1. 概述
E.6.2. 迁移到版本 18
E.6.3. 变更
E.6.4. 致谢

发布日期:. 2025-09-25

E.6.1. 概述 #

PostgreSQL 18 包含许多新特性和增强,其中包括:

  • 一个异步 I/O(AIO)子系统,可以提升顺序扫描、位图堆扫描、清理等操作的性能。

  • pg_upgrade 现在会保留优化器统计信息。

  • 支持“skip scan”查找,从而可以在更多情况下使用多列 B-tree 索引。

  • 新增 uuidv7() 函数,用于生成按时间戳排序的 UUID。

  • 虚拟生成列会在读取操作期间计算其取值。这现在是生成列的默认形式。

  • 支持OAuth 认证。

  • 在INSERT、UPDATE、DELETE和MERGE命令的 RETURNING 子句中支持 OLD 和 NEW。

  • 针对 PRIMARY KEY、 UNIQUE 和 FOREIGN KEY 约束的时间约束(即范围上的约束)。

上述项目以及 PostgreSQL 18 的其他新特性将在下文的章节中更详细地说明。

E.6.2. 迁移到版本 18 #

对于希望从任何先前发行版迁移数据的用户,需要使用pg_dumpall进行转储/恢复,或使用pg_upgrade或逻辑复制。有关迁移到新主版本的一般信息,请参见Section 18.6。

版本 18 包含许多可能影响与先前发行版兼容性的变更。请注意以下不兼容之处:

  • 更改initdb的默认设置以启用数据校验和(Greg Sabino Mullane) §

    可以使用新的 initdb 选项 --no-data-checksums 来禁用校验和。pg_upgrade要求集簇的校验和设置相匹配,因此这个新选项对于升级未启用校验和的旧集簇很有用。

  • 更改时区缩写的处理方式(Tom Lane) §

    系统现在会优先使用当前会话的时区缩写,之后才会检查服务器变量timezone_abbreviations。以前会首先检查 timezone_abbreviations。

  • 弃用MD5 密码认证(Nathan Bossart) §

    对 MD5 密码的支持将在未来的主版本中被移除。CREATE ROLE和ALTER ROLE现在在设置 MD5 密码时会发出弃用警告。将md5_password_warnings参数设置为 off 即可禁用这些警告。

  • 更改VACUUM和ANALYZE使其处理父表的继承子表(Michael Harris) §

    以前的行为可以通过使用新的 ONLY 选项来实现。

  • 防止 COPY FROM 在读取 CSV 文件时把 \. 当作文件结束标记(Daniel Vérité, Tom Lane) § §

    当从 STDIN 读取 CSV 文件时,psql仍会把 \. 当作文件结束标记。连接 PostgreSQL 18 服务器的较旧 psql 客户端可能会遇到 \copy 问题。本发行版还强制要求 \. 必须单独出现在一行上。

  • 禁止非日志(unlogged)分区表(Michael Paquier) §

    以前,ALTER TABLE SET [UN]LOGGED 不会做任何事情,而且创建非日志分区表也不会使其子分区变为非日志。

  • 以触发事件入队时处于活动状态的角色执行 AFTER 触发器(Laurenz Albe) §

    以前,这类触发器是以触发器执行时(例如执行COMMIT时)处于活动状态的角色运行的。对于在入队和事务提交之间角色发生变更的情形,这一点非常重要。

  • 移除 GRANT/REVOKE 中无实际功能的规则权限支持(Fujii Masao) §

    自 PostgreSQL 8.2 以来它们就一直不起作用。

  • 移除列 pg_backend_memory_contexts.parent (Melih Mutlu) §

    自 pg_backend_memory_contexts.path 列加入后,该列已无必要。

  • 将 pg_backend_memory_contexts.level 和 pg_log_backend_memory_contexts() 改为从 1 开始编号(Melih Mutlu, Atsushi Torikoshi, David Rowley, Fujii Masao) § § §

    它们以前是从 0 开始编号的。

  • 更改全文搜索,使其在读取配置文件和词典时使用集簇的默认排序规则提供者,而不是总是使用 libc(Peter Eisentraut) §

    对于默认使用非 libc 排序规则提供者(例如 ICU、builtin)且这些提供者对 LC_CTYPE 所处理字符的行为与 libc 不同的集簇,某些全文搜索函数以及pg_trgm扩展的行为可能会发生变化。使用pg_upgrade升级这类集簇时,建议在升级后重建所有与全文搜索和 pg_trgm 相关的索引。

E.6.3. 变更 #

以下详细介绍了 PostgreSQL 18 与上一个主要版本之间的更改。

E.6.3.1. 服务器 #

E.6.3.1.1. 优化器 #
  • 自动移除一些不必要的表自连接(Andrey Lepikhov, Alexander Kuzmenkov, Alexander Korotkov, Alena Rybakina) §

    可以通过服务器变量enable_self_join_elimination禁用此优化。

  • 将一些 IN (VALUES ...) 转换为 x = ANY ...,以获得更好的优化器统计信息(Alena Rybakina, Andrei Lepikhov) §

  • 允许将 OR 子句转换为数组,以加快索引处理(Alexander Korotkov, Andrey Lepikhov) §

  • 加速 INTERSECT、 EXCEPT、窗口聚合和视图列别名的处理(Tom Lane, David Rowley) § § § §

  • 允许对 SELECT DISTINCT 的键进行内部重排以避免排序(Richard Guo) §

    可以使用enable_distinct_reordering禁用此优化。

  • 忽略在功能上依赖于其他列的 GROUP BY 列(Zhang Mingli, Jian He, David Rowley) §

    如果 GROUP BY 子句包含某个唯一索引的全部列以及同一张表的其他列,那么这些其他列就是冗余的,可以从分组中去除。对于非延迟主键,这本来就已成立。

  • 允许将 HAVING 子句中作用于 GROUPING SETS 的一些子句下推到 WHERE 子句(Richard Guo) § § § §

    这可以更早地进行行过滤。本发布还修复了一些 GROUPING SETS 查询以前返回错误结果的问题。

  • 改进对使用 numeric 和 timestamp 值的 generate_series() 的行数估算(David Rowley, Song Jinzhou) § §

  • 允许优化器使用 Right Semi Join 计划(Richard Guo) §

    半连接用于需要判断是否至少存在一个匹配的情形。

  • 允许归并连接使用增量排序(Richard Guo) §

  • 提升对访问大量分区的查询进行规划的效率(Ashutosh Bapat, Yuya Watari, David Rowley) § §

  • 在更多情况下允许按分区连接,并减少其内存使用(Richard Guo, Tom Lane, Ashutosh Bapat) § §

  • 改进分区查询的代价估算(Nikita Malakhov, Andrei Lepikhov) §

  • 改进 SQL 语言函数的计划缓存(Alexander Pyhalov, Tom Lane) § §

  • 改进对已禁用的优化器特性的处理(Robert Haas) §

E.6.3.1.2. 索引 #
  • 允许对 btree 索引进行跳跃扫描(Peter Geoghegan) § §

    这使得多列 btree 索引可以在更多情况下使用,例如对第一个或靠前的索引列没有限制(或限制不是等值条件),而对靠后的索引列存在有效限制的情形。

  • 允许将非 btree 唯一索引用作分区键,以及在物化视图中使用(Mark Dilger) § §

    索引类型仍必须支持等值比较。

  • 允许并行创建 GIN 索引(Tomas Vondra, Matthias van de Meent) §

  • 允许对值进行排序,以加快范围类型 GiST 和 btree 索引的构建(Bernd Helmle) §

E.6.3.1.3. 总体性能 #
  • 新增异步 I/O 子系统(Andres Freund, Thomas Munro, Nazir Bilal Yavuz, Melanie Plageman) § § § § § § § § § § §

    此特性允许后端排队多个读请求,从而使顺序扫描、位图堆扫描、清理等操作更加高效。它由服务器变量io_method启用,并新增了用于控制它的服务器变量io_combine_limit和io_max_combine_limit。对于不支持 fadvise() 的系统,这也使effective_io_concurrency和maintenance_io_concurrency可以取大于零的值。新增的系统视图 pg_aios 显示正在用于异步 I/O 的文件句柄。

  • 提升访问大量关系的查询的锁性能(Tomas Vondra) §

  • 提升哈希连接和 GROUP BY 的性能并减少其内存使用(David Rowley, Jeff Davis) § § § § §

    这也改进了 EXCEPT 所使用的哈希集合操作,以及子计划值的哈希查找。

  • 允许普通清理冻结某些页面,即使这些页面已经是全部可见的(Melanie Plageman) § §

    这减少了以后整表冻结的开销。此行为的激进程度可以通过服务器变量和每表设置vacuum_max_eager_freeze_failure_rate来控制。以前,在需要冻结之前,清理从不处理全部可见的页面。

  • 新增服务器变量vacuum_truncate,用于控制VACUUM期间的文件截断(Nathan Bossart, Gurjeet Singh) §

    之前已经存在一个名称和行为相同的存储层级参数。

  • 将服务器变量effective_io_concurrency和maintenance_io_concurrency的默认值增加到 16(Melanie Plageman) § §

    这更准确地反映了现代硬件的情况。

E.6.3.1.4. 监控 #
  • 提高服务器变量log_connections的日志记录粒度(Melanie Plageman) §

    此服务器变量以前只能取布尔值,这种形式目前仍然受支持。

  • 新增 log_connections 选项,用于报告连接各阶段所花费的时间(Melanie Plageman) §

  • 为log_line_prefix新增转义序列 %L,用于输出客户端的 IP 地址(Greg Sabino Mullane) §

  • 新增服务器变量log_lock_failures,用于记录锁获取失败(Yuki Seino, Fujii Masao) § §

    具体来说,它报告 SELECT ... NOWAIT 的锁获取失败。

  • 修改 pg_stat_all_tables 及其变体,报告花费在VACUUM、ANALYZE以及它们的自动变体上的时间(Sami Imseih) §

    新增的列是 total_vacuum_time、 total_autovacuum_time、 total_analyze_time 和 total_autoanalyze_time。

  • 为VACUUM和ANALYZE新增延迟时间报告(Bertrand Drouvot, Nathan Bossart) § §

    此信息出现在服务器日志、系统视图 pg_stat_progress_vacuum 和 pg_stat_progress_analyze,以及VACUUM和ANALYZE以 VERBOSE 模式运行时的输出中;必须通过服务器变量track_cost_delay_timing启用跟踪。

  • 为 ANALYZE VERBOSE 新增 WAL、CPU 和平均读取统计信息输出(Anthonin Bonnefoy) § §

  • 在 VACUUM/ANALYZE (VERBOSE) 和自动清理的日志输出中新增已满 WAL 缓冲区计数(Bertrand Drouvot) §

  • 新增每后端 I/O 统计信息报告(Bertrand Drouvot) § §

    这些统计信息可通过 pg_stat_get_backend_io() 访问。每后端 I/O 统计信息可以通过 pg_stat_reset_backend_stats() 清除。

  • 为 pg_stat_io 新增以字节为单位报告 I/O 活动的列(Nazir Bilal Yavuz) §

    新增的列是 read_bytes、 write_bytes 和 extend_bytes。原来总是等于 BLCKSZ 的 op_bytes 列已被移除。

  • 在 pg_stat_io 中新增 WAL I/O 活动行(Nazir Bilal Yavuz, Bertrand Drouvot, Michael Paquier) § § §

    这包括 WAL 接收器活动以及这类写入的等待事件。

  • 更改服务器变量track_wal_io_timing,使其控制在 pg_stat_io 而不是 pg_stat_wal 中跟踪 WAL 计时(Bertrand Drouvot) §

  • 从 pg_stat_wal 中移除 read/sync 列(Bertrand Drouvot) § §

    这移除了列 wal_write、 wal_sync、 wal_write_time 和 wal_sync_time。

  • 新增函数 pg_stat_get_backend_wal(),用于返回每后端 WAL 统计信息(Bertrand Drouvot) §

    每后端 WAL 统计信息可以通过 pg_stat_reset_backend_stats() 清除。

  • 新增函数 pg_ls_summariesdir(),用于专门列出 PGDATA/pg_wal/summaries 的内容(Yushi Ogiwara) §

  • 新增列 pg_stat_checkpointer.num_done,用于报告已完成检查点的数量(Anton A. Melnikov) §

    列 num_timed 和 num_requested 统计的是已完成和已跳过的检查点。

  • 新增列 pg_stat_checkpointer.slru_written,用于报告写入的 SLRU 缓冲区(Nitin Jadhav) §

    此外,还修改了检查点的服务器日志消息,以分别报告共享缓冲区和 SLRU 缓冲区的数值。

  • 为 pg_stat_database 新增报告并行工作进程活动的列(Benoit Lobréau) §

    新增的列是 parallel_workers_to_launch 和 parallel_workers_launched。

  • 使查询 id 对常量列表的计算只考虑第一个和最后一个常量(Dmitry Dolgov, Sami Imseih) § § §

    pg_stat_statements 会使用这种查询搅混(jumbling)处理。

  • 调整查询 id 计算,把使用相同关系名的查询归为一组(Michael Paquier, Sami Imseih) §

    即使不同模式中的表具有不同的列名,情况也是如此。

  • 新增列 pg_backend_memory_contexts.type,用于报告内存上下文的类型(David Rowley) §

  • 新增列 pg_backend_memory_contexts.path,用于显示内存上下文的父上下文(Melih Mutlu) §

E.6.3.1.5. 权限 #
E.6.3.1.6. 服务器配置 #
  • 新增对 OAuth 认证方法的支持(Jacob Champion, Daniel Gustafsson, Thomas Munro) §

    这为 pg_hba.conf 新增了 oauth 认证方法、libpq OAuth 选项、用于加载令牌验证库的服务器变量oauth_validator_libraries,以及用于添加所需编译期库的配置选项 --with-libcurl。

  • 新增服务器变量ssl_tls13_ciphers,允许指定多个以冒号分隔的 TLSv1.3 加密套件(Erica Zhang, Daniel Gustafsson) §

  • 更改服务器变量ssl_groups的默认值,使其包含椭圆曲线 X25519(Daniel Gustafsson, Jacob Champion) §

  • 将服务器变量 ssl_ecdh_curve 重命名为ssl_groups,并允许指定多个以冒号分隔的 ECDH 曲线(Erica Zhang, Daniel Gustafsson) §

    以前的名称仍然有效。

  • 将取消请求密钥设为 256 位(Heikki Linnakangas, Jelte Fennema-Nio) § §

    只有当服务器和客户端都支持本发布中引入的线协议版本 3.2 时才能这样做。

  • 新增服务器变量autovacuum_worker_slots,用于指定后台工作进程的最大数量(Nathan Bossart) §

    设置此变量后,autovacuum_max_workers可以在运行时调整到不超过此最大值,而无需重启服务器。

  • 允许指定将触发自动清理的死元组固定数量(Nathan Bossart, Frédéric Yhuel) §

    该服务器变量是autovacuum_vacuum_max_threshold。触发时仍然使用百分比。

  • 更改服务器变量max_files_per_process,使其仅限制由后端打开的文件(Andres Freund) §

    以前,由 postmaster 打开的文件也被计入此限制。

  • 新增服务器变量num_os_semaphores,用于报告所需的信号量数量(Nathan Bossart) §

    这对操作系统配置很有用。

  • 新增服务器变量extension_control_path,用于指定扩展控制文件的位置(Peter Eisentraut, Matheus Alcantara) § §

E.6.3.1.7. 流复制与恢复 #
E.6.3.1.8. 逻辑复制 #
  • 允许对生成列的值进行逻辑复制(Shubham Khanna, Vignesh C, Zhijie Hou, Shlok Kyal, Peter Smith) § § § §

    如果发布指定了列列表,则所有指定的列(无论是否为生成列)都会被发布。如果没有指定列列表,则由发布选项 publish_generated_columns 控制是否发布生成列。以前生成列不会被复制,订阅者必须自行计算这些值(如果可能的话);这对于缺乏这种能力的非 PostgreSQL 订阅者特别有用。

  • 将CREATE SUBSCRIPTION的 streaming 选项默认值从 off 改为 parallel (Vignesh C) §

  • 允许ALTER SUBSCRIPTION更改复制槽的两阶段提交行为(Hayato Kuroda, Ajin Cherian, Amit Kapila, Zhijie Hou) § §

  • 在应用逻辑复制变更时记录冲突(Zhijie Hou, Nisha Moond) § § § § §

    还会在 pg_stat_subscription_stats 的新列中进行报告。

E.6.3.2. 工具命令 #

  • 允许生成列为虚拟,并将其设为默认 (Peter Eisentraut, Jian He, Richard Guo, Dean Rasheed) § § §

    虚拟生成列在读取列时生成其值,而不是在写入时。仍然可以通过 STORED 选项指定写入行为。

  • 为 DML 查询中的 RETURNING 添加 OLD/NEW 支持 (Dean Rasheed) §

    以前 RETURNING 只为INSERT和UPDATE返回新值,而为DELETE返回旧值;MERGE则会为其执行的内部查询返回相应的值。这一新语法允许 INSERT/UPDATE/DELETE/MERGE 的 RETURNING 列表使用特殊别名 old 和 new 显式返回旧值和新值。这些别名可以重命名,以避免标识符冲突。

  • 允许像现有的本地表一样创建外部表 (Zhang Mingli) §

    语法为 CREATE FOREIGN TABLE ... LIKE。

  • 允许 LIKE 与非确定性排序规则一起使用 (Peter Eisentraut) §

  • 允许文本位置搜索函数使用非确定性排序规则 (Peter Eisentraut) §

    这些操作以前会生成一个错误。

  • 添加内建排序规则提供程序 PG_UNICODE_FAST (Jeff Davis) §

    此区域设置支持大小写映射,但按码位顺序排序,而不是按自然语言顺序。

  • 允许VACUUM和ANALYZE处理分区表而不处理其子表 (Michael Harris) §

    通过新的 ONLY 选项启用。由于自动清理不会处理分区表本身,而只处理其子表,因此这很有用。

  • 添加用于修改每关系和每列优化器统计信息的函数 (Corey Huinker) § § §

    这些函数是 pg_restore_relation_stats()、 pg_restore_attribute_stats()、 pg_clear_relation_stats() 和 pg_clear_attribute_stats()。

  • 添加服务器变量file_copy_method来控制文件复制方法 (Nazir Bilal Yavuz) §

    它控制 CREATE DATABASE ... STRATEGY=FILE_COPY 和 ALTER DATABASE ... SET TABLESPACE 使用文件复制还是克隆。

E.6.3.2.1. 约束 #
  • 允许指定不重叠的 PRIMARY KEY、 UNIQUE 和外键约束 (Paul A. Jungwirth) § §

    对于 PRIMARY KEY 和 UNIQUE,可通过 WITHOUT OVERLAPS 指定;对于外键,则通过 PERIOD 指定,这些都应用于最后指定的列。

  • 允许将 CHECK 和外键约束指定为 NOT ENFORCED (Amul Sul) § §

    这还添加了列 pg_constraint.conenforced。

  • 要求主键/外键关系使用确定性排序规则或相同的非确定性排序规则 (Peter Eisentraut) §

    pg_dump 的恢复(也被pg_upgrade所使用)在不满足这些要求时将失败;必须更改模式,这些升级方法才能成功。

  • 将列的 NOT NULL 规范存储在 pg_constraint 中 (Álvaro Herrera, Bernd Helmle) § §

    这允许为 NOT NULL 约束指定名称。它还将 NOT NULL 约束添加到外部表,并为本地表添加 NOT NULL 继承控制。

  • 允许ALTER TABLE设置 NOT NULL 约束的 NOT VALID 属性 (Rushabh Lathia, Jian He) §

  • 允许修改 NOT NULL 约束的可继承性 (Suraj Kharage, Álvaro Herrera) § §

    语法为 ALTER TABLE ... ALTER CONSTRAINT ... [NO] INHERIT。

  • 允许在分区表上使用 NOT VALID 外键约束 (Amul Sul) §

  • 允许在分区表上以 ONLY 方式删除约束 (Álvaro Herrera) §

    这在以前被错误地禁止。

E.6.3.2.2. COPY #
  • 添加 REJECT_LIMIT 来控制 COPY FROM 可忽略的无效行数 (Atsushi Torikoshi) §

    在 ON_ERROR = 'ignore' 时可用。

  • 允许 COPY TO 从已填充的物化视图中复制行 (Jian He) §

  • 为 COPY 的 LOG_VERBOSITY 添加 silent 级别,以抑制被忽略行的日志输出 (Atsushi Torikoshi) §

    当 on_error = 'ignore' 时,此新级别会抑制被丢弃输入行的输出。

  • 禁止在外部表上使用 COPY FREEZE (Nathan Bossart) §

    以前 COPY 可以执行但 FREEZE 被忽略,因此现在禁止此命令。

E.6.3.2.3. EXPLAIN #
  • 在 EXPLAIN ANALYZE 中自动包含 BUFFERS 输出 (Guillaume Lelarge, David Rowley) §

  • 在 EXPLAIN (WAL) 输出中添加完整的 WAL 缓冲区计数 (Bertrand Drouvot) §

  • 在 EXPLAIN ANALYZE 中,报告每个索引扫描节点使用的索引查找次数 (Peter Geoghegan) §

  • 修改 EXPLAIN 以输出带小数的行计数 (Ibrar Ahmed, Ilia Evdokimov, Robert Haas) § §

  • 在 EXPLAIN 输出中为 Material、 Window Aggregate 和公共表表达式节点添加内存和磁盘使用细节 (David Rowley, Tatsuo Ishii) § § § §

  • 在 EXPLAIN 输出中添加关于窗口函数参数的细节 (Tom Lane) §

  • 在 EXPLAIN ANALYZE 中添加 Parallel Bitmap Heap Scan 工作进程缓存统计信息 (David Geier, Heikki Linnakangas, Donghang Lin, Alena Rybakina, David Rowley) §

  • 在 EXPLAIN ANALYZE 输出中标记被禁用的节点 (Robert Haas, David Rowley, Laurenz Albe) § § §

E.6.3.3. 数据类型 #

  • 改进 Unicode 的完整大小写映射和转换 (Jeff Davis) § §

    这增加了执行条件大小写映射和标题大小写映射的能力,以及将单个字符大小写映射为多个字符的能力。

  • 允许将 jsonb 的 null 值转换为标量类型时作为 NULL (Tom Lane) §

    以前这种转换会生成一个错误。

  • 为 json{b}_strip_nulls 添加可选参数,以允许移除 null 数组元素 (Florents Tselai) §

  • 添加函数 array_sort(),用于对数组的第一维进行排序 (Junwang Zhao, Jian He) §

  • 添加函数 array_reverse(),用于反转数组的第一维 (Aleksander Alekseev) §

  • 添加函数 reverse(),用于反转 bytea 的字节 (Aleksander Alekseev) §

  • 允许在整数类型与 bytea 之间进行转换 (Aleksander Alekseev) §

    整数值以 bytea 二进制补码值的形式存储。

  • 将 Unicode 数据更新到 Unicode 16.0.0 (Peter Eisentraut) §

  • 为爱沙尼亚语添加全文搜索词干提取 (Tom Lane) §

  • 改进 XML 错误代码,使其更接近 SQL 标准 (Tom Lane) §

    这些错误通过 SQLSTATE 报告。

E.6.3.4. 函数 #

E.6.3.5. Libpq #

  • 添加函数 PQfullProtocolVersion(),用于报告包含次版本号在内的完整协议版本号 (Jacob Champion, Jelte Fennema-Nio) §

  • 添加 libpq 连接参数和环境变量,用于指定连接可接受的最小和最大协议版本 (Jelte Fennema-Nio) § §

  • 向客户端报告search_path的更改 (Alexander Kukushkin, Jelte Fennema-Nio, Tomas Vondra) § §

  • 为所有消息类型(包括认证)添加 PQtrace() 输出 (Jelte Fennema-Nio) § § § § §

  • 添加 libpq 连接参数 sslkeylogfile,用于转储 SSL 密钥材料 (Abhishek Chanda, Daniel Gustafsson) §

    这对调试很有用。

  • 修改一些 libpq 函数签名以使用 int64_t (Thomas Munro) §

    这些以前使用 pg_int64,现在它已被弃用。

E.6.3.6. psql #

  • 允许 psql 解析、绑定和关闭命名预备语句 (Anthonin Bonnefoy, Michael Paquier) § §

    这是通过新命令 \parse、 \bind_named 和 \close_prepared。

  • 添加 psql 反斜杠命令,以允许发出流水线查询 (Anthonin Bonnefoy) § § §

    新命令为 \startpipeline、 \syncpipeline、\sendpipeline、 \endpipeline、\flushrequest、 \flush 和 \getresults。

  • 允许在 psql 提示符中添加流水线状态,并添加相关状态变量 (Anthonin Bonnefoy) §

    新的提示符字符是 %P,新的 psql 变量是 PIPELINE_SYNC_COUNT、 PIPELINE_COMMAND_COUNT 和 PIPELINE_RESULT_COUNT。

  • 允许将连接服务名添加到 psql 提示符,或通过 psql 变量访问它 (Michael Banck) §

  • 添加 psql 选项,以便在所有列表命令上使用扩展模式 (Dean Rasheed) §

    添加反斜杠后缀 x 即可启用此功能。

  • 更改 psql 的\conninfo以使用表格格式并包含更多信息 (Álvaro Herrera, Maiquel Grassi, Hunaid Sohail) §

  • 在 psql 的 \df+、 \do+、\dAo+ 和 \dC+ 输出中添加函数的防泄漏(leakproof)标记 (Yugo Nagata) §

  • 在 \dP+ 中添加分区关系的访问方法细节 (Justin Pryzby) §

  • 在 psql 的 \dx 扩展输出中添加 default_version (Magnus Hagander) §

  • 添加 psql 变量WATCH_INTERVAL来设置 \watch 的默认等待时间 (Daniel Gustafsson) §

E.6.3.7. 服务器应用 #

  • 更改initdb使其默认启用校验和 (Greg Sabino Mullane) § §

    新的 initdb 选项 --no-data-checksums 可禁用校验和。

  • 添加 initdb 选项 --no-sync-data-files,以避免同步堆/索引文件 (Nathan Bossart) §

    initdb 选项 --no-sync 仍可用于避免同步任何文件。

  • 添加vacuumdb选项 --missing-stats-only,以仅计算缺失的优化器统计信息 (Corey Huinker, Nathan Bossart) § §

    此选项只能由超级用户运行,并且只能与选项 --analyze-only 和 --analyze-in-stages 一起使用。

  • 添加pg_combinebackup选项 -k/--link 以启用硬链接 (Israel Barth Rubio, Robert Haas) §

    只有部分文件可以进行硬链接。如果这些备份将被独立使用,则不应使用此选项。

  • 允许pg_verifybackup验证 tar 格式的备份 (Amul Sul) §

  • 如果pg_rewind的 --source-server 指定了数据库名,则在 --write-recovery-conf 输出中使用它 (Masahiko Sawada) §

  • 添加pg_resetwal选项 --char-signedness 以更改默认 char 类型的符号性 (Masahiko Sawada) §

  • 添加pg_dump选项 --statistics (Jeff Davis) § §

  • 为 pg_dump 和pg_dumpall添加选项 --sequence-data,以转储通常会被排除的序列数据 (Nathan Bossart) § §

  • 为pg_dump、pg_dumpall和pg_restore添加选项 --statistics-only、--no-statistics、--no-data 和 --no-schema (Corey Huinker, Jeff Davis) §

  • 添加选项 --no-policies,以在pg_dump、pg_dumpall和pg_restore中禁用行级安全策略处理 (Nikolay Samokhvalov) §

    这对迁移到具有不同策略的系统很有用。

E.6.3.7.2. pg_upgrade #
  • 允许 pg_upgrade 保留优化器统计信息 (Corey Huinker, Jeff Davis, Nathan Bossart) § § § §

    扩展统计信息不会被保留。此外还新增了 pg_upgrade 选项 --no-statistics,用于禁用统计信息的保留。

  • 允许 pg_upgrade 并行处理数据库检查(Nathan Bossart) § § § § § § § § § § §

    这由现有的 --jobs 选项控制。

  • 新增 pg_upgrade 选项 --swap,以交换目录的方式取代复制、克隆或链接文件(Nathan Bossart) §

    这种模式可能是最快的。

  • 新增 pg_upgrade 选项 --set-char-signedness,用于设置新集簇默认的 char 符号性(Masahiko Sawada) § §

    用于处理 pre-PostgreSQL 18 集簇的默认 CPU 符号性与新集簇不匹配的情况。

E.6.3.7.3. 逻辑复制应用 #
  • 为pg_createsubscriber新增选项 --all,用于为所有数据库创建逻辑副本(Shubham Khanna) §

  • 新增 pg_createsubscriber 选项 --clean,用于移除发布(Shubham Khanna) § §

  • 新增 pg_createsubscriber 选项 --enable-two-phase,用于启用预备事务(Shubham Khanna) §

  • 为pg_recvlogical新增选项 --enable-failover,用于指定故障转移槽(Hayato Kuroda) §

    另外新增选项 --enable-two-phase 作为 --two-phase 的同义词,并弃用后者。

  • 允许 pg_recvlogical 的 --drop-slot 在没有 --dbname 的情况下工作(Hayato Kuroda) §

E.6.3.8. 源代码 #

  • 将注入点的加载与运行分离开来(Michael Paquier, Heikki Linnakangas) § §

    现在可以通过 INJECTION_POINT_LOAD() 创建注入点但不运行,这类注入点可通过 INJECTION_POINT_CACHED() 来运行。

  • 支持在注入点中使用运行时参数(Michael Paquier) §

  • 允许通过 IS_INJECTION_POINT_ATTACHED() 使用内联的注入点测试代码(Heikki Linnakangas) §

  • 使用 SIMD(单指令多数据)提升处理长 JSON 字符串的性能(David Rowley) §

  • 使用 x86 AVX-512 指令加速 CRC32C 计算(Raghuveer Devulapalli, Paul Amonson) §

  • 为 popcount(整数位计数)新增 ARM Neon 和 SVE CPU 内建函数(Chiranmoy Bhattacharya, Devanga Susmitha, Rama Malladi) § §

  • 提升 numeric 类型的乘法与除法运算速度(Joel Jacobson, Dean Rasheed) § § § §

  • 新增配置选项 --with-libnuma 以启用 NUMA 感知(Jakub Wartak, Bertrand Drouvot) § § §

    函数 pg_numa_available() 用于报告 NUMA 感知能力,系统视图 pg_shmem_allocations_numa 和 pg_buffercache_numa 则报告共享内存在各个 NUMA 节点上的分布情况。

  • 为 pg_index 增加 TOAST 表,以支持非常大的表达式索引(Nathan Bossart) §

  • 移除列 pg_attribute.attcacheoff (David Rowley) §

  • 新增列 pg_class.relallfrozen (Melanie Plageman) §

  • 在索引访问方法 API 中新增 amgettreeheight、 amconsistentequality 和 amconsistentordering(Mark Dilger) § §

  • 新增 GiST 支持函数 stratnum() (Paul A. Jungwirth) §

  • 在pg_controldata中记录 char 的默认 CPU 符号性(Masahiko Sawada) §

  • 在 PL/Python 中增加对 Python “受限 API”的支持(Peter Eisentraut) § §

    这有助于避免 Python 3.x 版本不匹配所导致的问题。

  • 将受支持的最低 Python 版本改为 3.6.8(Jacob Champion) §

  • 移除对早于 1.1.1 的 OpenSSL 版本的支持(Daniel Gustafsson) § §

  • 如果启用了 LLVM,则要求版本为 14 或更高(Thomas Munro) §

  • 新增宏 PG_MODULE_MAGIC_EXT,允许扩展报告其名称和版本(Andrei Lepikhov) §

    可以通过新函数 pg_get_loaded_modules() 访问这些信息。

  • 文档中说明 SPI_connect()/SPI_connect_ext() 总是返回成功(SPI_OK_CONNECT)(Stepan Neretin) §

    错误总是通过 ereport() 报告。

  • 新增关于 API 和 ABI 兼容性的文档章节(David Wheeler, Peter Eisentraut) §

  • 移除 Windows 上 Meson 构建的实验性标记(Aleksander Alekseev) §

  • 移除 configure 选项 --disable-spinlocks 和 --disable-atomics(Thomas Munro) § §

    现在要求必须支持 32 位原子操作。

  • 移除对 HPPA/PA-RISC 体系结构的支持(Tom Lane) §

E.6.3.9. 附加模块 #

  • 新增扩展pg_logicalinspect,用于检查逻辑快照(Bertrand Drouvot) §

  • 新增扩展pg_overexplain,用于向 EXPLAIN 的输出添加调试详细信息(Robert Haas) §

  • 为 postgres_fdw_get_connections() 新增输出列(Hayato Kuroda, Sagar Dilip Shedge) § § § §

    新输出列 used_in_xact 指示外部数据包装器当前是否正被某个事务使用, closed 指示连接是否已关闭, user_name 指示用户名, remote_backend_pid 指示远端后端进程标识符。

  • 允许将来自客户端的 SCRAM 认证传递给postgres_fdw服务器(Matheus Alcantara, Peter Eisentraut) §

    这样可以避免在数据库中存储 postgres_fdw 的认证信息,该功能通过 postgres_fdw 的 use_scram_passthrough 连接选项启用。libpq 使用新的连接参数scram_client_key和scram_server_key。

  • 允许将来自客户端的 SCRAM 认证传递给dblink服务器(Matheus Alcantara) §

  • 为file_fdw新增 on_error 和 log_verbosity 选项(Atsushi Torikoshi) §

    这些选项控制 file_fdw 如何处理和报告无效的文件行。

  • 新增 reject_limit,用于控制 file_fdw 可以忽略的无效行数(Atsushi Torikoshi) §

    仅当 ON_ERROR = 'ignore' 时才会生效。

  • 为passwordcheck新增可配置变量 min_password_length(Emanuele Musella, Maurizio Boriani) §

    该变量控制密码的最小长度。

  • 让pgbench在针对每个脚本的报告中给出失败、重试或被跳过事务的数量(Yugo Nagata) §

  • 新增isn服务器变量 weak,用于控制是否接受无效的校验位(Viktor Holmberg) §

    之前这只能通过函数 isn_weak() 来控制。

  • 允许对值进行排序,以加速btree_gist索引的构建(Bernd Helmle, Andrey Borodin) §

  • 新增amcheck检查函数 gin_index_check(),用于验证 GIN 索引(Grigory Kryachko, Heikki Linnakangas, Andrey Borodin) §

  • 新增函数 pg_buffercache_evict_relation() 和 pg_buffercache_evict_all() 用于逐出未被固定的共享缓冲区(Nazir Bilal Yavuz) §

    现有函数 pg_buffercache_evict() 现在会返回缓冲区刷写状态。

  • 允许扩展安装自定义的EXPLAIN选项(Robert Haas, Sami Imseih) § § §

  • 允许扩展使用服务器的累积统计 API(Michael Paquier) § §

E.6.3.9.1. pg_stat_statements #
  • 允许 pg_stat_statements 跟踪CREATE TABLE AS和DECLARE的查询(Anthonin Bonnefoy) §

    这些查询现在也会被分配查询 ID。

  • 允许 pg_stat_statements 对SET的值进行参数化(Greg Sabino Mullane, Michael Paquier) §

    这减少了由包含不同常量的 SET 语句造成的膨胀。

  • 新增 pg_stat_statements 列,用于报告并行活动(Guillaume Lelarge) §

    新增的列是 parallel_workers_to_launch 和 parallel_workers_launched。

  • 新增 pg_stat_statements.wal_buffers_full,用于报告 WAL 缓冲区写满的情况(Bertrand Drouvot) §

E.6.3.9.2. pgcrypto #
  • 新增 pgcrypto 算法 sha256crypt 和 sha512crypt(Bernd Helmle) §

  • 为 pgcrypto 的加密和解密功能增加 CFB 模式(Umar Hayat) §

  • 新增函数 fips_mode(),用于报告服务器的 FIPS 模式(Daniel Gustafsson) §

  • 新增 pgcrypto 服务器变量 builtin_crypto_enabled,允许禁用内建的非 FIPS 模式密码学函数(Daniel Gustafsson, Joe Conway) §

    这有助于保证 FIPS 模式的行为。

E.6.4. 致谢 #

以下人员(按字母顺序排列)以补丁作者、提交者、评审者、测试者或问题报告者的身份为本次发布做出了贡献。

Abhishek Chanda
Adam Guo
Adam Rauch
Aidar Imamov
Ajin Cherian
Alastair Turner
Alec Cozens
Aleksander Alekseev
Alena Rybakina
Alex Friedman
Alex Richman
Alexander Alehin
Alexander Borisov
Alexander Korotkov
Alexander Kozhemyakin
Alexander Kukushkin
Alexander Kuzmenkov
Alexander Kuznetsov
Alexander Lakhin
Alexander Pyhalov
Alexandra Wang
Alexey Dvoichenkov
Alexey Makhmutov
Alexey Shishkin
Ali Akbar
Álvaro Herrera
Álvaro Mongil
Amit Kapila
Amit Langote
Amul Sul
Andreas Karlsson
Andreas Scherbaum
Andreas Ulbrich
Andrei Lepikhov
Andres Freund
Andrew
Andrew Bille
Andrew Dunstan
Andrew Jackson
Andrew Kane
Andrew Watkins
Andrey Borodin
Andrey Chudnovsky
Andrey Rachitskiy
Andrey Rudometov
Andy Alsup
Andy Fan
Anthonin Bonnefoy
Anthony Hsu
Anthony Leung
Anton Melnikov
Anton Voloshin
Antonin Houska
Antti Lampinen
Arseniy Mukhin
Artur Zakirov
Arun Thirupathi
Ashutosh Bapat
Asphator
Atsushi Torikoshi
Avi Weinberg
Aya Iwata
Ayush Tiwari
Ayush Vatsa
Bastien Roucariès
Ben Peachey Higdon
Benoit Lobréau
Bernd Helmle
Bernd Reiß
Bernhard Wiedemann
Bertrand Drouvot
Bertrand Mamasam
Bharath Rupireddy
Bogdan Grigorenko
Boyu Yang
Braulio Fdo Gonzalez
Bruce Momjian
Bykov Ivan
Cameron Vogt
Cary Huang
Cédric Villemain
Cees van Zeeland
ChangAo Chen
Chao Li
Chapman Flack
Charles Samborski
Chengwen Wu
Chengxi Sun
Chiranmoy Bhattacharya
Chris Gooch
Christian Charukiewicz
Christoph Berg
Christophe Courtois
Christopher Inokuchi
Clemens Ruck
Corey Huinker
Craig Milhiser
Crisp Lee
Dagfinn Ilmari Mannsåker
Daniel Elishakov
Daniel Gustafsson
Daniel Vérité
Daniel Westermann
Daniele Varrazzo
Daniil Davydov
Daria Shanina
Dave Cramer
Dave Page
David Benjamin
David Christensen
David Fiedler
David G. Johnston
David Geier
David Rowley
David Steele
David Wheeler
David Zhang
Davinder Singh
Dean Rasheed
Devanga Susmitha
Devrim Gündüz
Dian Fay
Dilip Kumar
Dimitrios Apostolou
Dipesh Dhameliya
Dmitrii Bondar
Dmitry Dolgov
Dmitry Koval
Dmitry Kovalenko
Dmitry Yurichev
Dominique Devienne
Donghang Lin
Dorjpalam Batbaatar
Drew Callahan
Duncan Sands
Dwayne Towell
Dzmitry Jachnik
Egor Chindyaskin
Egor Rogov
Emanuel Ionescu
Emanuele Musella
Emre Hasegeli
Eric Cyr
Erica Zhang
Erik Nordström
Erik Rijkers
Erik Wienhold
Erki Eessaar
Ethan Mertz
Etienne LAFARGE
Etsuro Fujita
Euler Taveira
Evan Si
Evgeniy Gorbanev
Fabio R. Sluzala
Fabrízio de Royes Mello
Feike Steenbergen
Feliphe Pozzer
Felix
Fire Emerald
Florents Tselai
Francesco Degrassi
Frank Streitzig
Frédéric Yhuel
Fredrik Widlert
Gabriele Bartolini
Gavin Panella
Geoff Winkless
George MacKerron
Gilles Darold
Grant Gryczan
Greg Burd
Greg Sabino Mullane
Greg Stark
Grigory Kryachko
Guillaume Lelarge
Gunnar Morling
Gunnar Wagner
Gurjeet Singh
Haifang Wang
Hajime Matsunaga
Hamid Akhtar
Hannu Krosing
Hari Krishna Sunder
Haruka Takatsuka
Hayato Kuroda
Heikki Linnakangas
Hironobu Suzuki
Holger Jakobs
Hubert Lubaczewski
Hugo Dubois
Hugo Zhang
Hunaid Sohail
Hywel Carver
Ian Barwick
Ibrar Ahmed
Igor Gnatyuk
Igor Korot
Ilia Evdokimov
Ilya Gladyshev
Ilyasov Ian
Imran Zaheer
Isaac Morland
Israel Barth Rubio
Ivan Kush
Jacob Brazeal
Jacob Champion
Jaime Casanova
Jakob Egger
Jakub Wartak
James Coleman
James Hunter
Jan Behrens
Japin Li
Jason Smith
Jayesh Dehankar
Jeevan Chalke
Jeff Davis
Jehan-Guillaume de Rorthais
Jelte Fennema-Nio
Jian He
Jianghua Yang
Jiao Shuntian
Jim Jones
Jim Nasby
Jingtang Zhang
Jingzhou Fu
Joe Conway
Joel Jacobson
John Hutchins
John Naylor
Jonathan Katz
Jorge Solórzano
José Villanova
Josef Šimánek
Joseph Koshakow
Julien Rouhaud
Junwang Zhao
Justin Pryzby
Kaido Vaikla
Kaimeh
Karina Litskevich
Karthik S
Kartyshov Ivan
Kashif Zeeshan
Keisuke Kuroda
Kevin Hale Boyes
Kevin K Biju
Kirill Reshke
Kirill Zdornyy
Koen De Groote
Koichi Suzuki
Koki Nakamura
Konstantin Knizhnik
Kouhei Sutou
Kuntal Ghosh
Kyotaro Horiguchi
Lakshmi Narayana Velayudam
Lars Kanis
Laurence Parry
Laurenz Albe
Lele Gaifax
Li Yong
Lilian Ontowhee
Lingbin Meng
Luboslav Špilák
Luca Vallisa
Lukas Fittl
Maciek Sakrejda
Magnus Hagander
Mahendra Singh Thalor
Mahendrakar Srinivasarao
Maiquel Grassi
Maksim Korotkov
Maksim Melnikov
Man Zeng
Marat Buharov
Marc Balmer
Marco Nenciarini
Marcos Pegoraro
Marina Polyakova
Mark Callaghan
Mark Dilger
Marlene Brandstaetter
Marlene Reiterer
Martin Rakhmanov
Masahiko Sawada
Masahiro Ikeda
Masao Fujii
Mason Mackaman
Mat Arye
Matheus Alcantara
Mats Kindahl
Matthew Gabeler-Lee
Matthew Kim
Matthew Sterrett
Matthew Woodcraft
Matthias van de Meent
Matthieu Denais
Maurizio Boriani
Max Johnson
Max Madden
Maxim Boguk
Maxim Orlov
Maximilian Chrzan
Melanie Plageman
Melih Mutlu
Mert Alev
Michael Banck
Michael Bondarenko
Michael Christofides
Michael Guissine
Michael Harris
Michaël Paquier
Michail Nikolaev
Michal Kleczek
Michel Pelletier
Mikaël Gourlaouen
Mikhail Gribkov
Mikhail Kot
Milosz Chmura
Muralikrishna Bandaru
Murat Efendioglu
Mutaamba Maasha
Naeem Akhter
Nat Makarevitch
Nathan Bossart
Navneet Kumar
Nazir Bilal Yavuz
Neil Conway
Niccolò Fei
Nick Davies
Nicolas Maus
Niek Brasa
Nikhil Raj
Nikita
Nikita Kalinin
Nikita Malakhov
Nikolay Samokhvalov
Nikolay Shaplov
Nisha Moond
Nitin Jadhav
Nitin Motiani
Noah Misch
Noboru Saito
Noriyoshi Shinoda
Ole Peder Brandtzæg
Oleg Sibiryakov
Oleg Tselebrovskiy
Olleg Samoylov
Onder Kalaci
Ondrej Navratil
Patrick Stählin
Paul Amonson
Paul Jungwirth
Paul Ramsey
Pavel Borisov
Pavel Luzanov
Pavel Nekrasov
Pavel Stehule
Peter Eisentraut
Peter Geoghegan
Peter Mittere
Peter Smith
Phil Eaton
Philipp Salvisberg
Philippe Beaudoin
Pierre Giraud
Pixian Shi
Polina Bungina
Przemyslaw Sztoch
Quynh Tran
Rafia Sabih
Raghuveer Devulapalli
Rahila Syed
Rama Malladi
Ran Benita
Ranier Vilela
Renan Alves Fonseca
Richard Guo
Richard Neill
Rintaro Ikeda
Robert Haas
Robert Treat
Robins Tharakan
Roman Zharkov
Ronald Cruz
Ronan Dunklau
Rui Zhao
Rushabh Lathia
Rustam Allakov
Ryo Kanbayashi
Ryohei Takahashi
RyotaK
Sagar Dilip Shedge
Salvatore Dipietro
Sam Gabrielsson
Sam James
Sameer Kumar
Sami Imseih
Samuel Thibault
Satyanarayana Narlapuram
Sebastian Skalacki
Senglee Choi
Sergei Kornilov
Sergey Belyashov
Sergey Dudoladov
Sergey Prokhorenko
Sergey Sargsyan
Sergey Soloviev
Sergey Tatarintsev
Shaik Mohammad Mujeeb
Shawn McCoy
Shenhao Wang
Shihao Zhong
Shinya Kato
Shlok Kyal
Shubham Khanna
Shveta Malik
Simon Riggs
Smolkin Grigory
Sofia Kopikova
Song Hongyu
Song Jinzhou
Soumyadeep Chakraborty
Sravan Kumar
Srinath Reddy
Stan Hu
Stepan Neretin
Stephen Fewer
Stephen Frost
Steve Chavez
Steven Niu
Suraj Kharage
Sven Klemm
Takamichi Osumi
Takeshi Ideriha
Tatsuo Ishii
Ted Yu
Tels
Tender Wang
Teodor Sigaev
Thom Brown
Thomas Baehler
Thomas Krennwallner
Thomas Munro
Tim Wood
Timur Magomedov
Tobias Wendorff
Todd Cook
Tofig Aliev
Tom Lane
Tomas Vondra
Tomasz Rybak
Tomasz Szypowski
Torsten Foertsch
Toshi Harada
Tristan Partin
Triveni N
Umar Hayat
Vallimaharajan G
Vasya Boytsov
Victor Yegorov
Vignesh C
Viktor Holmberg
Vinícius Abrahão
Vinod Sridharan
Virender Singla
Vitaly Davydov
Vladlen Popolitov
Vladyslav Nebozhyn
Walid Ibrahim
Webbo Han
Wenhui Qiu
Will Mortensen
Will Storey
Wolfgang Walther
Xin Zhang
Xing Guo
Xuneng Zhou
Yan Chengpen
Yang Lei
Yaroslav Saburov
Yaroslav Syrytsia
Yasir Hussain
Yasuo Honda
Yogesh Sharma
Yonghao Lee
Yoran Heling
Yu Liang
Yugo Nagata
Yuhang Qiu
Yuki Seino
Yura Sokolov
Yurii Rashkovskii
Yushi Ogiwara
Yusuke Sugie
Yuta Katsuragi
Yuto Sasaki
Yuuki Fujii
Yuya Watari
Zane Duffield
Zeyuan Hu
Zhang Mingli
Zhihong Yu
Zhijie Hou
Zsolt Parragi