↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

已结束支持的版本: 9.6
历史版本。 PostgreSQL 9.6 已结束支持。 2021-11-11. 请参阅 当前版本手册.

E.25. 版本 9.6 #

发布日期:. 2016-09-29

E.25.1. 概述

PostgreSQL 9.6 的主要增强包括:

  • 顺序扫描、连接和聚合的并行执行

  • 避免在 vacuum 冻结操作期间不必要地扫描页

  • 同步复制现在允许多个备库服务器以提高可靠性

  • 全文搜索现在可以搜索短语(多个相邻单词)

  • postgres_fdw 现在支持远程连接、排序、UPDATE 和 DELETE

  • 实质性的性能改进,特别是在多 CPU 插槽服务器上的可伸缩性方面

上述各项在下面的章节中有更详细的说明。

E.25.2. 迁移到版本 9.6

希望从任何之前的版本迁移数据的用户,需要使用pg_dumpall进行转储/恢复,或使用pg_upgrade。

版本 9.6 包含许多可能影响与以前版本兼容性的更改。注意以下不兼容之处:

  • 改进 pg_stat_activity 视图关于进程在等待什么的信息(Amit Kapila、Ildus Kurbangaliev)

    历史上只有进程在等待重量级锁时才显示为等待中。现在等待轻量级锁和缓冲区 pin 也会显示在 pg_stat_activity 中。此外,所等待的锁类型现在也可见。这些更改用 wait_event_type 和 wait_event 列替换了 waiting 列。

  • 在 to_char() 中,(需要时的)减号不再计为时间相关字段宽度的一部分(Bruce Momjian)

    例如 to_char('-4 years'::interval, 'YY') 现在返回 -04 而不是 -4。

  • 使 extract() 对无穷大输入的表现更合理(Vitaly Burovoy)

    历史上 extract() 函数给定无穷时间戳时只是返回零,无论给定的字段名是什么。现在当请求的字段是单调递增的(如 year、epoch)时返回 infinity 或 -infinity,不是时(如 day、hour)返回 NULL。此外,对坏字段名抛出预期的错误。

  • 移除 PL/pgSQL 中抑制 RAISE 命令发出消息的 CONTEXT 最内层的“特性”(Pavel Stehule)

    这一古老的向后兼容 hack 被认为已失去用处。

  • 修复默认文本搜索解析器允许 email 和 host 记号中的前导数字(Artur Zakirov)

    大多数情况下这只会导致文本解析的少量变化。但如果你有这种地址频繁出现的数据,可能值得重建相关的 tsvector 列和索引,使这种形式的地址能被文本搜索正确找到。

  • 扩展 contrib/unaccent 的标准 unaccent.rules 文件以处理 Unicode 已知的所有变音符号,并正确展开连字(Thomas Munro、Léonard Benedetti)

    以前的版本漏掉了转换一些较不常见的带变音符号字母。此外连字现在被展开为单独的字母。使用此规则文件的安装可能希望重建依赖其结果的 tsvector 列和索引。

  • 从 CREATE ROLE 及相关命令中移除早已弃用的 CREATEUSER/NOCREATEUSER 选项(Tom Lane)

    由于古老的向后兼容原因,CREATEUSER 实际上意味着 SUPERUSER。这一直是(合理地)期望它表示 CREATEROLE 的人们的持续困惑源。它已被弃用十年,因此通过移除来修复问题。

  • 把以 pg_ 开头的角色名视为保留(Stephen Frost)

    现在不允许用户创建这种角色名。这防止与 initdb 创建的内建角色冲突。

  • 把 information_schema.routines 视图中的列名 result_cast_character_set_name 改为 result_cast_char_set_name(Clément Prévost)

    SQL:2011 标准指定了较长的名字,但这看起来是个错误,因为相邻列名和其他 information_schema 视图都使用较短的风格。

  • psql 的 -c 选项不再隐含 --no-psqlrc(Pavel Stehule、Catalin Iacob)

    显式写 --no-psqlrc(或其缩写 -X)来获得旧行为。这样修改后的脚本在旧版本 psql 中仍能工作。

  • 改进 pg_restore 的 -t 选项匹配所有类型的关系,而不只是普通表(Craig Ringer)

  • 更改 pg_controldata 及相关地方用于 NextXID 的显示格式(Joe Conway、Bruce Momjian)

    以 number:number 格式显示纪元加事务 ID 值。以前的格式 number/number 与 LSN 使用的格式惊人地相似。

  • 更新扩展函数在适当之处标记为并行安全(Andreas Karlsson)

    许多标准扩展已被更新以允许其函数在并行查询工作者进程中执行。这些更改在从以前版本 pg_upgrade 过来的数据库中不会生效,除非对每个这种扩展(在集簇的每个数据库中)应用 ALTER EXTENSION UPDATE。

E.25.3. 变更

下面你将找到 PostgreSQL 9.6 与前一个大版本之间更改的详细说明。

E.25.3.1. 服务器

E.25.3.1.1. 并行查询
  • 并行查询(Robert Haas、Amit Kapila、David Rowley 等许多人)

    在 9.6 中,PostgreSQL 引入了对大查询并行执行的初步支持。只有驱动表通过顺序扫描访问的严格只读查询可以并行化。哈希连接和嵌套循环可以并行执行,聚合(对受支持的聚合)也是。还有很多工作要做,但这已经是一组有用的特性。

    并行查询执行(还)没有默认启用。要允许它,把新配置参数max_parallel_workers_per_gather设为大于零的值。对并行性使用的额外控制可通过其他新配置参数force_parallel_mode、parallel_setup_cost、parallel_tuple_cost和min_parallel_relation_size获得。

  • 提供标记函数并行安全状态的基础设施(Robert Haas、Amit Kapila)

E.25.3.1.2. 索引
  • 允许 GIN 索引构建有效利用大于 1 GB 的maintenance_work_mem设置(Robert Abraham、Teodor Sigaev)

  • 把从 GIN 索引未决列表删除的页立即加入空闲空间映射(Jeff Janes、Teodor Sigaev)

    这减少了表不常清理时的膨胀。

  • 添加 gin_clean_pending_list() 函数以允许手动调用 GIN 索引的未决列表清理(Jeff Janes)

    以前这种清理只作为清理或分析父表的副产品发生。

  • 改进 GiST 索引中死索引元组的处理(Anastasia Lubennikova)

    现在当索引扫描注意到相应的堆元组已死时,死索引元组会被如此标记。插入元组时,标记为死的元组将在需要为页面腾出空间时被移除。

  • 为 box 类型添加 SP-GiST 操作符类(Alexander Lebedev)

E.25.3.1.3. 排序
  • 通过在执行外部排序步骤时使用快速排序而非替换选择排序来改进排序性能(Peter Geoghegan)

    新方法对典型缓存大小和数据量更好地利用了 CPU 缓存。必要时可以通过新配置参数replacement_sort_tuples调整行为。

  • 加速同一字符串出现多次的文本排序(Peter Geoghegan)

  • 通过使用“缩写”键加速 uuid、bytea 和 char(n) 字段的排序(Peter Geoghegan)

    对非默认操作符类 text_pattern_ops、varchar_pattern_ops 和 bpchar_pattern_ops 也添加了缩写键支持。有序集聚合的处理现在也可以利用缩写键。

  • 通过在排序期间把 TID 当作 64 位整数加速 CREATE INDEX CONCURRENTLY(Peter Geoghegan)

E.25.3.1.4. 锁定
  • 减少对 ProcArrayLock 的争用(Amit Kapila、Robert Haas)

  • 通过把缓冲区内容锁移入缓冲区描述符来改进性能(Andres Freund、Simon Riggs)

  • 用原子操作替换共享缓冲区头自旋锁以改进可伸缩性(Alexander Korotkov、Andres Freund)

  • 使用原子操作而非自旋锁保护 LWLock 的等待队列(Andres Freund)

  • 对共享哈希表空闲列表分区以减少多 CPU 插槽服务器上的争用(Aleksander Alekseev)

  • 减少备库服务器重放 btree 索引清理操作期间的互锁(Simon Riggs)

    此更改避免了重放这种操作期间有时发生的显著复制延迟。

E.25.3.1.5. 优化器统计信息
  • 改进 ANALYZE 对有许多空值的列的估计(Tomas Vondra、Alex Shulgin)

    此前 ANALYZE 倾向于低估有许多 NULL 的列中非 NULL 不同值的数量,计算最常见值也不准确。

  • 改进规划器对查询结果中不同值数量的估计(Tomas Vondra)

  • 使用外键关系推断连接谓词的选择率(Tomas Vondra、David Rowley)

    如果表 t 有外键限制,比如 (a,b) REFERENCES r (x,y),那么诸如 t.a = r.x AND t.b = r.y 的 WHERE 条件对每个 t 行最多只能选择一个 r 行。规划器以前把这些 AND 条件视为独立的,因此常常严重误估选择率。现在它把 WHERE 条件与适用的外键约束比较并产生更好的估计。

E.25.3.1.6. VACUUM
  • 避免重新清理只包含冻结元组的页(Masahiko Sawada、Robert Haas、Andres Freund)

    以前防回卷清理必须访问表的每一页,即使无事可做的页。现在只包含已冻结元组的页会在表的可见性映射中被标识,即使在防止事务回卷时也可以被清理跳过。这应能大大降低维护大部分数据不变的大表的代价。

    必要时可以用新的 DISABLE_PAGE_SKIPPING 选项强制清理处理全冻结页。通常永远不需要这样做,但它可能有助于从可见性映射损坏中恢复。

  • 避免 VACUUM 期间无用的堆截断尝试(Jeff Janes、Tom Lane)

    此更改在某些不可能截断的情况下避免取得排他表锁。主要好处是避免备库服务器上不必要的查询取消。

E.25.3.1.7. 一般性能
  • 允许旧的 MVCC 快照在可配置的超时后失效(Kevin Grittner)

    通常,被删除的元组在最后一个可能“看到”它们的事务消失之前不能被清理物理移除。因此保持打开很长时间的事务可能因为空间无法回收而导致相当大的表膨胀。此特性允许通过新配置参数old_snapshot_threshold对 MVCC 快照保证有效的时间设置基于时间的限制。之后死元组就成为移除候选。使用过期快照的事务如果试图读取可能包含过这种数据的页,就会得到错误。

  • 忽略功能上依赖于其他列的 GROUP BY 列(David Rowley)

    如果 GROUP BY 子句包含非延迟主键的所有列以及同一表的其他列,那些其他列是冗余的、可以从分组中丢弃。这在许多常见场景中节省计算。

  • 当部分索引的 WHERE 子句引用未被索引的列时,允许对它使用仅索引扫描(Tomas Vondra、Kyotaro Horiguchi)

    例如由 CREATE INDEX tidx_partial ON t(b) WHERE a > 0 定义的索引现在可以被指定了 WHERE a > 0 且不以其他方式使用 a 的查询用于仅索引扫描。以前这是不允许的,因为 a 未被列为索引列。

  • 按排序顺序执行检查点写(Fabien Coelho、Andres Freund)

    以前检查点以脏页碰巧出现在共享缓冲区中的顺序(通常近乎随机)写出它们。这性能很差,特别是在旋转介质上。此更改使检查点驱动的写按文件和块号顺序执行,并在表空间之间平衡。

  • 在可行之处,在可配置次数的写之后触发内核回写,以防止内核磁盘缓冲区中脏数据的积累(Fabien Coelho、Andres Freund)

    PostgreSQL 把数据写入内核的磁盘缓存,之后在适当时候被刷到物理存储。许多操作系统对此管理不善,允许大量脏数据积累后才决定一次全部刷出,导致新 I/O 请求长时间延迟直到刷写完成。此更改尝试通过在可配置间隔后显式请求数据刷写来缓解此问题。

    在 Linux 上为此使用 sync_file_range(),并且该特性在 Linux 上默认打开,因为该函数几乎没有缺点。如果其他平台有 msync() 或 posix_fadvise(),这种刷写能力也可用,但这些接口有一些不良副作用,因此该特性在非 Linux 平台上默认禁用。

    新配置参数backend_flush_after、bgwriter_flush_after、checkpoint_flush_after和wal_writer_flush_after控制这一行为。

  • 通过在多个聚合有相同参数和转换函数时共享计算来改进聚合函数性能(David Rowley)

    例如 SELECT AVG(x), VARIANCE(x) FROM tab 可以对两个聚合使用单次逐行计算。

  • 通过检查当前事务的快照而非 pg_clog 来决定源事务是否应被视为已提交,加速最近创建元组的可见性测试(Jeff Janes、Tom Lane)

  • 允许比以前更早设置元组提示位(Andres Freund)

  • 改进短命预备事务的性能(Stas Kelvich、Simon Riggs、Pavan Deolasee)

    两阶段提交信息现在只在 PREPARE TRANSACTION 期间写入 WAL,如果紧接着提交,将在 COMMIT PREPARED 期间从 WAL 读回。只有当未决事务在下一次检查点之前没有被提交或中止时才创建单独的状态文件。

  • 改进内存上下文销毁的性能(Jan Wieck)

  • 改进有多个被跟踪对象的资源所有者的性能(Aleksander Alekseev)

  • 加速 timestamp、time 和 date 数据类型的输出函数(David Rowley、Andres Freund)

  • 避免重放取得 AccessExclusive 锁的操作期间热备查询的一些不必要取消(Jeff Janes)

  • 当关系的扩展锁有争用时一次扩展关系多个块(Dilip Kumar)

    这通过减少争用改进可伸缩性。

  • 增加 clog 缓冲区数量以获得更好的可伸缩性(Amit Kapila、Andres Freund)

  • 通过始终保持简单变量的 ParamListInfo 条目有效,加速 PL/pgSQL 中的表达式求值(Tom Lane)

  • 避免在最近的 Windows 版本上把 SO_SNDBUF 设置降低到默认值以下(Chen Huajun)

  • 在 Windows 上默认禁用update_process_title(Takayuki Tsunakawa)

    更新进程标题的开销在 Windows 上比大多数其他平台大得多,而且由于大多数 Windows 用户没有能显示进程标题的工具,这样做也没那么有用。

E.25.3.1.8. 监控
  • 添加 pg_stat_progress_vacuum 系统视图以为 VACUUM 操作提供进度报告(Amit Langote、Robert Haas、Vinayak Pokale、Rahila Syed)

  • 添加 pg_control_system()、pg_control_checkpoint()、pg_control_recovery() 和 pg_control_init() 函数以把 pg_control 的字段暴露给 SQL(Joe Conway、Michael Paquier)

  • 添加 pg_config 系统视图(Joe Conway)

    此视图暴露与 pg_config 命令行实用程序相同的信息,即 PostgreSQL 的各种编译时配置信息。

  • 在 pg_replication_slots 系统视图中添加 confirmed_flush_lsn 列(Marko Tiikkaja)

  • 添加 pg_stat_wal_receiver 系统视图以提供热备服务器 WAL 接收器进程的状态信息(Michael Paquier)

  • 添加 pg_blocking_pids() 函数以可靠地识别哪些会话阻塞哪些会话(Tom Lane)

    此函数返回阻塞具有给定进程 ID 的会话的任何会话的进程 ID 数组。历史上用户通过对 pg_locks 视图自连接获得这种信息。但以任何正确性这样做都异常繁琐,而且并行查询的加入使旧方法完全不实用,因为锁可能被子工作者进程而非会话的主进程持有或等待。

  • 添加函数 pg_current_xlog_flush_location() 以暴露当前事务日志刷写位置(Tomas Vondra)

  • 添加函数 pg_notification_queue_usage() 以报告 NOTIFY 队列的占用程度(Brendan Jurd)

  • 限制内存上下文统计转储的冗长程度(Tom Lane)

    内存不足失败期间输出到 postmaster 日志的内存使用转储现在在有大量内存上下文时汇总统计,而不是可能生成非常大的报告。现在还有“总计”汇总行。

E.25.3.1.9. Authentication
  • 添加 BSD 认证方法以允许 PostgreSQL 客户端认证使用 BSD 认证服务(Marisa Emerson)

    BSD 认证当前只在 OpenBSD 上可用。

  • 使用 PAM 认证时,通过 PAM_RHOST 项向 PAM 模块提供客户端 IP 地址或主机名(Grzegorz Sampolski)

  • 在 postmaster 日志中为更多类型的密码认证失败提供细节(Tom Lane)

    所有通常可达的密码认证失败情况现在都应在日志中提供具体的 DETAIL 字段。

  • 支持长达 128 个字符的 RADIUS 密码(Marko Tiikkaja)

  • 添加新的 SSPI 认证参数 compat_realm 和 upn_username,控制 SSPI 认证期间使用 NetBIOS 还是 Kerberos 领域名和用户名(Christian Ullrich)

E.25.3.1.10. 服务器配置
  • 允许处于空闲于事务状态过久的会话被自动终止(Vik Fearing)

    这一行为由新配置参数idle_in_transaction_session_timeout控制。它有助于防止被遗忘的事务过久持有锁或妨碍清理。

  • 把checkpoint_timeout允许的最大值提高到 24 小时(Simon Riggs)

  • 允许 effective_io_concurrency 按表空间设置,以支持不同表空间有不同 I/O 特性的情况(Julien Rouhaud)

  • 添加log_line_prefix选项 %n 以 Unix 纪元形式(带毫秒)打印当前时间(Tomas Vondra、Jeff Davis)

  • 添加syslog_sequence_numbers和syslog_split_messages配置参数,为记录到 syslog 时的消息格式提供更多控制(Peter Eisentraut)

  • 把wal_level配置参数的 archive 和 hot_standby 值合并为单一新值 replica(Peter Eisentraut)

    区分这些设置不再有用,合并它们是朝计划中的未来复制设置简化迈出的一步。旧名字仍被接受但在内部转换为 replica。

  • 添加 configure 选项 --with-systemd 以在服务器启动和停止时启用调用 sd_notify()(Peter Eisentraut)

    这允许使用 notify 类型的 systemd 服务单元,大大简化了 PostgreSQL 在 systemd 下的管理。

  • 允许服务器的 SSL 密钥文件在由 root 拥有时具有组读访问(Christoph Berg)

    以前我们坚持密钥文件由运行 PostgreSQL 服务器的用户拥有,但在配置为集中管理证书的一些系统(如 Debian)上这不方便。因此允许密钥文件由 root 拥有并具有组读访问的情况。由操作系统管理员确保该组不包含任何不受信任的用户。

E.25.3.1.11. 可靠性
  • 如果 postmaster 死亡,强制后端退出(Rajeev Rastogi、Robert Haas)

    在正常情况下 postmaster 总是比其子进程活得长。如果 postmaster 因某种原因死亡,强制后端会话报错退出。以前现有的后端会继续运行直到其客户端断开,但那既不安全又低效。它还阻止新的 postmaster 启动,直到最后一个旧后端退出。后端将在等待客户端 I/O 时检测 postmaster 死亡,所以退出不是瞬时的,但不会晚于当前查询结束。

  • 在报告约束违反失败之前检查可序列化冲突(Thomas Munro)

    使用可序列化事务隔离时,希望任何因并发事务导致的错误都表现为序列化失败,从而提示应用重试可能成功。不幸的是,对并发插入导致的重复键失败这不能可靠发生。此更改确保如果应用在事务中早些时候显式检查过冲突键的存在(且未找到),这种错误将被报告为序列化错误。

  • 确保失效消息即使由未分配 XID 的事务发出也被记录到 WAL 中(Andres Freund)

    这修复了一些备库服务器上的事务没有注意到更改(如新索引)的边界情况。

  • 防止多个进程并发尝试清理 GIN 索引的未决列表(Teodor Sigaev、Jeff Janes)

    这是有意允许的,但它导致的竞态条件可能使清理遗漏它需要删除的索引条目。

E.25.3.2. 复制与恢复

  • 允许同步复制支持多个同时的同步备库服务器而不只是一个(Masahiko Sawada、Beena Emerson、Michael Paquier、Fujii Masao、Kyotaro Horiguchi)

    提交被认为完成之前必须确认的备库服务器数量现在可作为synchronous_standby_names参数的一部分进行配置。

  • 为配置参数synchronous_commit添加新设置 remote_apply(Thomas Munro)

    在这种模式下,主库等待事务在备库服务器上被应用而不只是写入磁盘。这意味着你可以指望备库上启动的事务看到主库先前确认的所有提交。

  • 为复制协议添加一项特性,并为 pg_create_physical_replication_slot() 添加相应选项,允许在创建复制槽时立即保留 WAL(Gurjeet Singh、Michael Paquier)

    这允许创建复制槽来保证基础备份所需的所有 WAL 都可用。

  • 为pg_basebackup添加 --slot 选项(Peter Eisentraut)

    这让 pg_basebackup 能使用为 WAL 流式传输定义的复制槽。基础备份完成后,为常规流复制选择同一槽允许新的备库服务器无缝启动。

  • 扩展 pg_start_backup() 和 pg_stop_backup() 以支持非独占备份(Magnus Hagander)

E.25.3.3. 查询

  • 允许返回元组集合的函数返回简单的 NULL(Andrew Gierth、Tom Lane)

    在 SELECT FROM function(...) 的上下文中,返回复合值集合的函数以前不允许作为集合的一部分返回普通的 NULL 值。现在这是允许的并被解释为一行 NULL。这避免了例如展开复合值数组时的边界错误。

  • 完全支持带多行 VALUES 的 INSERT 的目标列列表中的数组下标和字段选择(Tom Lane)

    以前这种情况下如果同一目标列被提及多于一次就会失败,例如 INSERT INTO tab (x[1], x[2]) VALUES (...)。

  • 在适当之处把 SELECT 输出表达式的求值推迟到 ORDER BY 排序之后(Konstantin Knizhnik)

    此更改确保输出列表中的易变或昂贵函数按 ORDER BY 建议的顺序执行,并且当有 LIMIT 子句时不会被求值超过需要的次数。以前如果排序由索引扫描或合并前排序执行这些性质成立,但由顶层排序执行时不成立。

  • 把记录已处理元组数的计数器加宽到 64 位(Andreas Scherbaum)

    此更改允许命令标记(如 SELECT)正确报告超过 40 亿的元组数。这也适用于 PL/pgSQL 的 GET DIAGNOSTICS ... ROW_COUNT 命令。

  • 避免通过 MULE_INTERNAL 编码进行编码转换(Tom Lane)

    以前西里尔和中欧单字节编码的许多转换是通过转换到相关的 MULE_INTERNAL 编码方案再转到目标编码完成的。除了低效之外,这意味着当转换遇到不可翻译字符时,错误消息会令人困惑地抱怨无法转换到或从 MULE_INTERNAL,而不是用户可见的编码。

  • 只有当外部表将在同一角色 ID 下被访问时才考虑远程执行外部表的连接(Shigeru Hanada、Ashutosh Bapat、Etsuro Fujita)

    以前外部连接下推基础设施把安全问题完全留给各个外部数据包装器,但这使 FDW 太容易无意中创建微妙的安全漏洞。因此改为核心代码决定哪个角色 ID 将访问每个表,除非所有相关关系的角色相同,否则不尝试连接下推。

E.25.3.4. 工具命令

  • 允许 COPY 复制 INSERT/UPDATE/DELETE ... RETURNING 查询的输出(Marko Tiikkaja)

    以前必须编写中间 CTE 才能得到这个结果。

  • 引入 ALTER object DEPENDS ON EXTENSION(Abhijit Menon-Sen)

    此命令允许把数据库对象标记为依赖于某个扩展,使它在扩展被删除时自动删除(不需要 CASCADE)。但该对象不是扩展的一部分,因此 pg_dump 会单独转储它。

  • 使 ALTER object SET SCHEMA 在对象已位于请求的模式中时不做任何事,而不是像历史上对大多数对象类型那样抛出错误(Marti Raudsepp)

  • 为 ALTER OPERATOR 添加选项以允许更改与现有操作符关联的选择率函数(Yury Zhuravlev)

  • 为 ALTER TABLE ADD COLUMN 添加 IF NOT EXISTS 选项(Fabrízio de Royes Mello)

  • 降低 ALTER TABLE 在设置 fillfactor 和自动清理相关关系选项时所需的锁强度(Fabrízio de Royes Mello、Simon Riggs)

  • 引入 CREATE ACCESS METHOD 以允许扩展创建索引访问方法(Alexander Korotkov、Petr Jelínek)

  • 为 CREATE EXTENSION 添加 CASCADE 选项以自动创建所请求扩展依赖的任何扩展(Petr Jelínek)

  • 使 CREATE TABLE ... LIKE 在任何源表有 OID 列时包含 OID 列(Bruce Momjian)

  • 如果 CHECK 约束在表创建命令中被声明为 NOT VALID,自动把它标记为有效(Amit Langote、Amul Sul)

    这是安全的,因为表没有现有行。这与 FOREIGN KEY 约束的长期行为一致。

  • 修复 DROP OPERATOR 清除指向被删除操作符的 pg_operator.oprcom 和 pg_operator.oprnegate 链接(Roma Sokolov)

    以前这种链接保持原样,在被删除操作符的 OID 被复用于另一个操作符这种不太可能的事件中可能造成问题。

  • 不在 EXPLAIN 输出中两次显示同一子计划(Tom Lane)

    某些情况下(通常涉及索引条件中的 SubPlan 节点),EXPLAIN 会两次打印同一子计划的数据。

  • 禁止在系统列上创建索引,OID 列除外(David Rowley)

    这种索引从未被视为受支持,而且很可能行为不当,因为系统可能在不更新索引的情况下更改元组的系统列字段。但以前没有防止创建它们的错误检查。

E.25.3.5. 权限管理

  • 使用权限系统管理对敏感函数的访问(Stephen Frost)

    以前许多安全敏感函数包含硬编码的检查,在被非超级用户调用时会抛出错误。这迫使一些相对平常的任务使用超级用户角色。硬编码的错误检查现已移除,改为让 initdb 撤销这些函数上的公共 EXECUTE 权限。这允许安装选择把这种函数的使用权授予不需要全部超级用户权限的可信角色。

  • 创建一些内建角色,可用于授予对以前仅限超级用户的函数的访问(Stephen Frost)

    当前唯一这种角色是 pg_signal_backend,但预计未来会添加更多。

E.25.3.6. 数据类型

  • 改进全文搜索以支持搜索短语,即以特定顺序相邻出现或之间有指定距离的词素(Teodor Sigaev、Oleg Bartunov、Dmitry Ivanov)

    短语搜索查询可以在 tsquery 输入中用新操作符 <-> 和 <N> 指定。前者表示它前后的词素必须以该顺序相邻出现。后者表示它们必须恰好相隔 N 个词素。

  • 允许在数组切片说明符中省略一个或两个边界,例如 array_col[3:](Yury Zhuravlev)

    省略的边界被当作相应数组下标的上限或下限。这使许多常见用例的指定更简单。

  • 更谨慎地处理超出范围的日期和时间戳(Vitaly Burovoy)

    此更改防止对非常接近实现限制的 timestamp with time zone 值出现意外的超出范围错误。以前“同一”值可能被接受也可能不被接受,取决于 timezone 设置,这意味着转储和重新装载可能在一个先前被接受的值上失败。现在限制根据等价的 UTC 时间而非本地时间执行,因此与 timezone 无关。

    此外,PostgreSQL 现在更谨慎地检测计算新日期或时间戳值的操作(如 date + integer)中的溢出。

  • 对几何数据类型,确保 infinity 和 NaN 分量值在输入和输出期间被一致处理(Tom Lane)

    这种值现在总是与它们在简单 float8 列中打印的方式相同地打印,输入时以相同方式接受。以前行为与平台相关。

  • 升级 ispell 词典类型以处理现代 Hunspell 文件并支持更多语言(Artur Zakirov)

  • 在正则表达式中实现后顾约束(Tom Lane)

    后顾约束与前瞻约束类似,不消耗文本;但它检查在字符串当前点结束的匹配(或不存在),而不是在当前点开始的匹配。许多其他正则表达式引擎中存在类似特性。

  • 在正则表达式中,如果表面上的三位八进制转义 \nnn 会超过 377(十进制 255),就假定它是两位八进制转义(Tom Lane)

    这使行为与当前的 Tcl 版本匹配。

  • 添加事务 ID 操作符 xid <> xid 和 xid <> int4,以与相应的相等操作符保持一致(Michael Paquier)

E.25.3.7. 函数

  • 添加 jsonb_insert() 函数,用于向 jsonb 数组插入新元素,或向 jsonb 对象插入此前不存在的键(Dmitry Dolgov)

  • 提高 ln()、log()、exp() 和 pow() 函数在 numeric 类型上的计算精度(Dean Rasheed)

  • 添加 scale(numeric) 函数以提取 numeric 值的显示标度(Marko Tiikkaja)

  • 添加以度为单位的三角函数(Dean Rasheed)

    例如 sind() 以度度量其参数,而 sin() 以弧度度量。这些函数竭力在可以期待精确结果的值上给出精确结果,例如 sind(30) = 0.5。

  • 确保三角函数按照 POSIX 标准处理 infinity 和 NaN 输入(Dean Rasheed)

    POSIX 标准说这些函数对 NaN 输入应返回 NaN,对包括 infinity 在内的超出范围输入应抛出错误。以前我们的行为随平台而异。

  • 使 to_timestamp(float8) 把浮点 infinity 转换为时间戳 infinity(Vitaly Burovoy)

    以前它对无穷输入只会失败。

  • 为 tsvector 数据添加新函数(Stas Kelvich)

    新函数是 ts_delete()、ts_filter()、unnest()、tsvector_to_array()、array_to_tsvector(),以及只为指定词素设置权重的 setweight() 变体。

  • 允许 ts_stat() 和 tsvector_update_trigger() 对与预期参数类型二进制兼容的类型(而不只是恰好该类型)的值进行操作;例如在期望 text 之处允许 citext(Teodor Sigaev)

  • 添加可变参数函数 num_nulls() 和 num_nonnulls(),统计其参数中空或非空的数量(Marko Tiikkaja)

    一个用法示例是 CHECK(num_nonnulls(a,b,c) = 1),断言 a,b,c 中恰好有一个不为 NULL。这些函数还可用于统计数组中空或非空元素的数量。

  • 添加函数 parse_ident() 以把限定的、可能带引号的 SQL 标识符拆分成各部分(Pavel Stehule)

  • 在 to_number() 中,把 V 格式代码解释为除以 10 的 V 后数字次数幂(Bruce Momjian)

    这使它以与 to_char() 相逆的方式操作。

  • 使 to_reg*() 函数接受 text 类型而非 cstring(Petr Korobeinikov)

    这避免了在参数不是简单字面常量的大多数情况下编写显式强制转换的需要。

  • 添加 pg_size_bytes() 函数以把人类可读的大小字符串转换为数字(Pavel Stehule、Vitaly Burovoy、Dean Rasheed)

    此函数把 pg_size_pretty() 产生的字符串转换为字节。一个用法示例是 SELECT oid::regclass FROM pg_class WHERE pg_total_relation_size(oid) > pg_size_bytes('10 GB')。

  • 在 pg_size_pretty() 中,负数的格式化与正数相似(Adrian Vondendriesch)

    以前负数从不缩写,只是以字节打印。

  • 为 current_setting() 函数添加可选的 missing_ok 参数(David Christensen)

    这允许对无法识别的参数名避免错误,改为返回 NULL。

  • 更改各种目录检查函数对无效输入返回 NULL(Michael Paquier)

    pg_get_viewdef() 现在给定无效的视图 OID 时返回 NULL,几个类似函数对坏输入同样返回 NULL。以前这种情况通常导致 “cache lookup failed” 错误,这些错误本不应在面向用户的情况中出现。

  • 修复 pg_replication_origin_xact_reset() 使之不带任何参数(Fujii Masao)

    文档说它没有参数,C 代码也不期望任何参数,但 pg_proc 中的条目错误地指定了两个参数。

E.25.3.8. 服务器端语言

  • 在 PL/pgSQL 中,在编译函数时检测不匹配的 CONTINUE 和 EXIT 语句,而不是在执行时(Jim Nasby)

  • 扩展 PL/Python 的错误报告和消息报告函数,允许指定主错误消息之外的其他消息字段(Pavel Stehule)

  • 允许 PL/Python 函数通过 SPI 递归调用自身,并修复在一个查询中调用多个返回集合的 PL/Python 函数时的行为(Alexey Grishchenko、Tom Lane)

  • 修复 PL/Python 中的会话生命周期内存泄漏(Heikki Linnakangas、Haribabu Kommi、Tom Lane)

  • 使 PL/Tcl 现代化,使用 Tcl 的“对象” API 而非简单字符串(Jim Nasby、Karl Lehenbauer)

    这在某些情况下可以显著改进性能。注意 PL/Tcl 现在要求 Tcl 8.4 或更新版本。

  • 在 PL/Tcl 中,使数据库报告的错误在 Tcl 的 errorCode 全局变量中返回附加信息(Jim Nasby、Tom Lane)

    此特性遵循 Tcl 返回错误辅助数据的惯例。

  • 修复 PL/Tcl 在数据库编码和 UTF-8(Tcl 所期望的)之间执行编码转换(Tom Lane)

    以前字符串不经转换直接传递,当数据库编码不是 UTF-8 时导致非 ASCII 字符的错误行为。

E.25.3.9. 客户端接口

  • 在错误和通知消息中添加 severity 字段的未本地化版本(Tom Lane)

    此更改允许客户端代码确定错误或通知的严重性,而不必担心 severity 字符串的本地化变体。

  • 在 libpq 中引入一项特性,可以始终或只对非错误消息抑制消息的 CONTEXT 字段(Pavel Stehule)

    PQerrorMessage() 的默认行为现在只对错误打印 CONTEXT。新函数 PQsetErrorContextVisibility() 可用于调整这一点。

  • 在 libpq 中添加以不同详细级别重新生成错误消息的支持(Alex Shulgin)

    这通过新函数 PQresultVerboseErrorMessage() 完成。这支持 psql 的新 \errverbose 特性,对其他客户端也可能有用。

  • 改进 libpq 的 PQhost() 函数,为默认 Unix 套接字连接返回有用数据(Tom Lane)

    以前如果没有给出显式主机说明它会返回 NULL;现在返回默认套接字目录路径。

  • 修复 ecpg 的词法分析器处理预处理指令行上注释中的换行(Michael Meskes)

E.25.3.10. 客户端应用程序

  • 为pg_dump和pg_restore添加 --strict-names 选项(Pavel Stehule)

    此选项使程序在 -t 或 -n 选项没有匹配时报怨,而不是静默地不做任何事。

  • 在 pg_dump 中,转储对系统对象的本地权限分配更改(Stephen Frost)

    虽然超级user总是可以更改内建或扩展创建对象的权限分配,但这种更改以前在转储和重新装载中丢失。现在 pg_dump 识别并转储这种更改。(但这只在从 9.6 或更晚服务器转储时有效。)

  • 允许 pg_dump 转储扩展拥有的模式中的非扩展拥有对象(Martín Marqués)

    以前这种对象被忽略,因为被错误地假定属于拥有其模式的扩展。

  • 在 pg_dump 输出中,对只在每表内唯一命名的对象类型(例如触发器)的对象标记中包含表名(Peter Eisentraut)

E.25.3.10.1. psql
  • 支持多个 -c 和 -f 命令行选项(Pavel Stehule、Catalin Iacob)

    指定的操作按给出选项的顺序执行,然后 psql 终止。

  • 添加以交叉表显示打印查询结果的 \crosstabview 命令(Daniel Vérité)

    在交叉表显示中,来自一个查询结果列的数据值被放在一个网格中,其列和行标题来自其他查询结果列。

  • 添加以完整详细程度显示最后一个服务器错误的 \errverbose 命令(Alex Shulgin)

    这在得到意外错误之后很有用——不再需要调整 VERBOSITY 变量并重现失败来查看默认不显示的错误字段。

  • 添加用于编辑和显示视图定义的 \ev 和 \sv 命令(Petr Korobeinikov)

    它们与现有的用于函数的 \ef 和 \sf 命令平行。

  • 添加执行查询并把结果重新作为新查询提交的 \gexec 命令(Corey Huinker)

  • 允许 \pset C string 设置表标题,与 \C string 一致(Bruce Momjian)

  • 在 \pset expanded auto 模式下,对只有一列的查询结果不使用扩展格式(Andreas Karlsson、Robert Haas)

  • 改进 \watch 命令输出的头(Michael Paquier、Tom Lane)

    包括 \pset title 字符串(如果已设置),并把头部预制部分缩短为 timestamp (every Ns)。此外时间戳格式现在遵循 psql 的区域环境。

  • 改进 Tab 补全逻辑以考虑整个输入查询,而不只是当前行(Tom Lane)

    以前把命令拆成多行会击败任何需要看到前几行单词的 Tab 补全规则。

  • Tab 补全行为的大量小改进(Peter Eisentraut、Vik Fearing、Kevin Grittner、Kyotaro Horiguchi、Jeff Janes、Andreas Karlsson、Fujii Masao、Thomas Munro、Masahiko Sawada、Pavel Stehule)

  • 添加 PROMPT 选项 %p 以插入所连接后端的进程 ID(Julien Rouhaud)

  • 引入一项特性,可以始终或只对非错误消息抑制消息的 CONTEXT 字段(Pavel Stehule)

    只对错误打印 CONTEXT 现在是默认行为。可以通过设置特殊变量 SHOW_CONTEXT 更改。

  • 使 \df+ 显示函数访问权限和并行安全属性(Michael Paquier)

E.25.3.10.2. pgbench
  • pgbench 脚本中的 SQL 命令现在以分号而非换行结束(Kyotaro Horiguchi、Tom Lane)

    此更改允许脚本中的 SQL 命令跨多行。现有的自定义脚本需要修改,在每个还没有分号的行尾添加分号。(这样做不会破坏脚本在旧版本 pgbench 中的使用。)

  • 支持反斜杠命令表达式中的浮点运算以及一些内建函数(Fabien Coelho)

  • 用内建函数替换 \setrandom(Fabien Coelho)

    新内建函数包括 random()、random_exponential() 和 random_gaussian(),它们执行与 \setrandom 相同的工作,但更易于使用,因为可以嵌入更大的表达式。由于这些添加使 \setrandom 过时,将其移除。

  • 允许调用内建脚本的多个副本,而不只是自定义脚本(Fabien Coelho)

    这通过新的 -b 开关完成,它对自定义脚本的作用类似于 -f。

  • 允许更改脚本的选择概率(权重)(Fabien Coelho)

    当指定多个脚本时,每个 pgbench 事务随机选择一个执行。以前这总是以均匀概率完成,但现在可以为不同脚本指定不同的选择概率。

  • 在多脚本运行中为每个脚本收集统计信息(Fabien Coelho)

    此特性为现有的全局和逐命令统计输出添加了一个中间细节级别。

  • 添加 --progress-timestamp 选项以用 Unix 纪元时间戳报告进度,而不是自运行开始以来的时间(Fabien Coelho)

  • 允许客户端连接数(-c)不必是线程数(-j)的精确倍数(Fabien Coelho)

  • 使用 -T 选项时,在指定时间结束时及时停止(Fabien Coelho)

    以前指定低事务速率可能导致 pgbench 等待明显长于指定的时间。

E.25.3.11. 服务器应用程序

  • 改进 initdb 引导后阶段的错误报告(Tom Lane)

    以前这里的错误导致把整个输入文件报告为“失败的查询”;现在只报告当前查询。为获得期望的行为, initdb 输入文件中的查询必须用空行分隔。

  • 通过为所有引导后步骤只使用一个独立后端会话来加速 initdb(Tom Lane)

  • 改进pg_rewind使它能在目标时间线更改时工作(Alexander Korotkov)

    这允许例如把已提升的备库回卷到旧主库时间线的某个状态。

E.25.3.12. 源代码

  • 移除过时的 heap_formtuple/ heap_modifytuple/ heap_deformtuple 函数(Peter Geoghegan)

  • 添加宏使 AllocSetContextCreate() 调用更简单、更安全(Tom Lane)

    现在不推荐为内存上下文写出各个大小参数,改为使用新宏 ALLOCSET_DEFAULT_SIZES、ALLOCSET_SMALL_SIZES 或 ALLOCSET_START_SMALL_SIZES 之一。但现有代码仍然工作。

  • 在头文件中无条件使用 static inline 函数(Andres Freund)

    这对非常老的编译器可能导致警告和/或浪费代码空间,但记法上的改进看来值得。

  • 改进 TAP 测试基础设施(Michael Paquier、Craig Ringer、Álvaro Herrera、Stephen Frost)

    值得注意的是,现在可以使用此基础设施测试恢复场景。

  • 使 trace_lwlocks 按名称标识各个锁(Robert Haas)

  • 改进 psql 的 Tab 补全代码基础设施(Thomas Munro、Michael Paquier)

    Tab 补全规则现在编写起来相当容易,也更紧凑。

  • 把 pg_shseclabel 系统目录钉入缓存,使它在连接认证期间可被访问(Adam Brightwell)

    核心代码不把此目录用于认证,但扩展可能希望查询它。

  • 重构索引访问方法 API,在 C 层面隐藏其大部分(Alexander Korotkov、Andrew Gierth)

    此更改把索引 AM API 现代化,使其看起来更像我们为外部数据包装器和 tablesample 处理器采用的设计。这简化了 C 代码并使在可安装扩展中定义索引访问方法实际可行。结果是 pg_am 系统目录的大多数列消失了。添加了新的检查函数,允许 SQL 查询确定以前可以从 pg_am 发现的索引 AM 属性。。

  • 添加 pg_init_privs 系统目录以保存 initdb 创建和扩展创建对象的原始权限(Stephen Frost)

    此基础设施允许 pg_dump 转储安装可能对附加到系统对象的权限所做的更改。以前这种更改在转储和重新装载中丢失,但现在被保留。

  • 更改扩展分配自定义 LWLock 的方式(Amit Kapila、Robert Haas)

    RequestAddinLWLocks() 函数被移除,替换为 RequestNamedLWLockTranche()。这允许更好地标识自定义 LWLock,也更不容易出错。

  • 改进隔离测试器以允许多个会话并发等待,允许测试死锁场景(Robert Haas)

  • 引入可扩展节点类型(KaiGai Kohei)

    此更改允许 FDW 或自定义扫描提供者以比以前更方便的格式在计划树中存储数据。

  • 使规划器通过生成和比较 Path 来处理扫描/连接之后的查询步骤,替换大量特设逻辑(Tom Lane)

    此更改今天只提供边际的用户可见改进,但它使将来许多上层规划器改进成为可能,这些在旧代码结构下不切实际。

  • 支持部分聚合(David Rowley、Simon Riggs)

    此更改允许把聚合函数的计算拆分为单独的部分,例如使并行工作者进程能够协作计算聚合。将来它可能允许跨本地和远程数据的聚合部分在远程端发生。

  • 添加通用命令进度报告设施(Vinayak Pokale、Rahila Syed、Amit Langote、Robert Haas)

  • 把 psql 的 flex 词法分析器分离出来供其他客户端程序使用(Tom Lane、Kyotaro Horiguchi)

    这消除了需要能够很好地解析 SQL 命令以识别命令边界的程序中的代码重复。以完整的一般性做到这一点比人们希望的更痛苦,到目前为止在我们支持的客户端程序中只有 psql 真正做对了。

    创建了新的源代码子目录 src/fe_utils/ 来保存这个和其他在客户端程序之间共享的代码。以前这种共享是通过在构建时符号链接或复制源文件完成的,这很丑陋且需要重复编译。

  • 引入 WaitEventSet API 以允许高效等待通常不会在两次等待之间更改的事件集(Andres Freund、Amit Kapila)

  • 添加用于写 WAL 记录的通用接口(Alexander Korotkov、Petr Jelínek、Markus Nullmeier)

    此更改允许扩展使用标准布局为页更改写 WAL 记录。需要在无法访问扩展的情况下重放 WAL 的问题通过通用重放代码解决。这允许扩展实现例如索引访问方法并让它们有 WAL 支持。

  • 支持逻辑解码的通用 WAL 消息(Petr Jelínek、Andres Freund)

    此特性允许扩展把数据插入 WAL 流中,逻辑解码插件可以读取它,但它与物理数据恢复无关。

  • 允许 SP-GiST 操作符类在沿索引下降时存储任意“遍历值”(Alexander Lebedev、Teodor Sigaev)

    这有点像“重建值”,但它可以是任意数据块,不一定是与被索引列相同的数据类型。

  • 为 ereport() 引入 LOG_SERVER_ONLY 消息级别(David Steele)

    此级别的行为像 LOG,只是消息永远不会发送到客户端。它用于审计和类似应用。

  • 提供构建所有生成头文件的 Makefile 目标(Michael Paquier、Tom Lane)

    现在可以调用 submake-generated-headers 来确保生成的后端头文件是最新的。这在可能“独立”构建的子目录中有用。

  • 支持 OpenSSL 1.1.0(Andreas Karlsson、Heikki Linnakangas)

E.25.3.13. 附加模块

  • 添加配置参数 auto_explain.sample_rate,允许 contrib/auto_explain 只捕获所有查询的可配置比例(Craig Ringer、Julien Rouhaud)

    这允许减少重查询流量的开销,同时仍平均获得有用信息。

  • 添加 contrib/bloom 模块,实现基于 Bloom 过滤的索引访问方法(Teodor Sigaev、Alexander Korotkov)

    这主要是非核心索引访问方法的概念验证,但对搜索许多列的查询本身也可能有用。

  • 在 contrib/cube 中,为 cube 引入距离操作符,并支持 cube 列上 GiST 索引中的 kNN 式搜索(Stas Kelvich)

  • 使 contrib/hstore 的 hstore_to_jsonb_loose() 和 hstore_to_json_loose() 函数对什么算数字达成一致(Tom Lane)

    以前 hstore_to_jsonb_loose() 会把数字样子的字符串转换为 JSON 数字而不是字符串,即使它们不完全匹配 JSON 的数字语法规范。这与 hstore_to_json_loose() 不一致,因此收紧测试以匹配 JSON 语法。

  • 为 contrib/intarray 操作符添加选择率估计函数,以改进使用这些操作符的查询的计划(Yury Zhuravlev、Alexander Korotkov)

  • 使 contrib/pageinspect 的 heap_page_items() 函数显示每个元组中的原始数据,并添加新函数 tuple_data_split() 和 heap_page_item_attrs() 用于检查单个元组字段(Nikolay Shaplov)

  • 为 contrib/pgcrypto 的 pgp_sym_encrypt() 函数添加可选的 S2K 迭代计数参数(Jeff Janes)

  • 为 contrib/pg_trgm 添加对“单词相似度”的支持(Alexander Korotkov、Artur Zakirov)

    这些函数和操作符度量一个字符串与另一个字符串中最相似的单个单词之间的相似度。

  • 为 contrib/pg_trgm 的相似度阈值添加配置参数 pg_trgm.similarity_threshold(Artur Zakirov)

    此阈值一直可配置,但以前由特殊用途函数 set_limit() 和 show_limit() 控制。它们现在被弃用。

  • 改进 contrib/pg_trgm 的 GIN 操作符类,加速同时出现常见和罕见键的索引搜索(Jeff Janes)

  • 改进 contrib/pg_trgm GIN 索引中相似度搜索的性能(Christophe Fornaroli)

  • 添加 contrib/pg_visibility 模块以允许检查表可见性映射(Robert Haas)

  • 向 contrib/sslinfo 添加 ssl_extension_info() 函数,打印当前连接所用 X509 证书中存在的 SSL 扩展信息(Dmitry Voronin)

E.25.3.13.1. postgres_fdw
  • 如果扩展在外部服务器的选项中被列入白名单,允许扩展提供的操作符和函数被发送到远程执行(Paul Ramsey)

    当已知远程数据库中存在兼容版本的扩展时,用户可以启用此特性。它允许更高效地执行涉及扩展操作符的查询。

  • 考虑在远程服务器上执行排序(Ashutosh Bapat)

  • 考虑在远程服务器上执行连接(Shigeru Hanada、Ashutosh Bapat)

  • 在可行之处完全在远程服务器上执行 UPDATE 或 DELETE(Etsuro Fujita)

    以前远程更新涉及发送 SELECT FOR UPDATE 命令然后逐个更新或删除选中的行。虽然如果操作需要任何本地处理那仍然必要,但如果查询的所有元素都可以安全地发送到远程服务器,现在可以远程完成。

  • 允许把获取大小设置为服务器或表选项(Corey Huinker)

    以前 postgres_fdw 总是从远程查询每次获取 100 行;现在该行为可配置。

  • 对全部映射到同一远程用户的本地用户 ID 使用单一外部服务器连接(Ashutosh Bapat)

  • 把查询取消请求传输到远程服务器(Michael Paquier、Etsuro Fujita)

    以前本地查询取消请求不会导致已发送的远程查询提前终止。

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.