E.9. 版本 9.6

E.9.1. 概述
E.9.2. 迁移到版本9.6
E.9.3. 修改列表

发布日期. 2016-09-29

E.9.1. 概述

PostgreSQL 9.6 中的主要增强包括:

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

  • 避免在清理冻结操作期间不必要的扫描页面

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

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

  • postgres_fdw现在支持远程连接、排序、 UPDATEDELETE

  • 显著的性能改进,特别是在有多个CPU插槽的服务器(即:多路服务器)中的可扩展性领域

上面的条目在下面的章节中有更详细的解释。

E.9.2. 迁移到版本9.6

希望从以前的版本迁移数据的用户需要使用pg_dumpall 或使用pg_upgrade转储/恢复。

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

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

    历史上,如果一个进程正在等待重量级锁,则只显示为等待。 现在等待轻量级锁和缓冲区引脚也显示在pg_stat_activity中。 此外,正在等待的锁的类型现在是可见的。这些改变用 wait_event_typewait_event替换 waiting列。

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

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

  • extract() 在处理无限输入时表现的更合理 (Vitaly Burovoy)

    历史上,无论给定的字段名称如何,extract() 函数在给出无限时间戳时都都返回零。让它在请求的字段是单调增加的字段时 (例如,yearepoch),适当的返回infinity-infinity,不是单调增加的字段时返回NULL (例如,dayhour)。此外, 为错误的字段名称抛出预期的错误。

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

    这种古老的向后兼容性已经失效了。

  • 修正默认文本搜索解析器,以允许emailhost 标记中的前导数字 (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_nameresult_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)

    许多标准扩展已经更新,以允许它们的功能在并行查询工作进程中执行。 除非对每个这样的扩展(在集群的每个数据库中)应用 ALTER EXTENSION UPDATE,否则这些更改不会在以前版本的数据库 pg_upgrade中起作用。

E.9.3. 修改列表

下面你将看到PostgreSQL 9.6和以前主要版本之间的详细更改。

E.9.3.1. 服务器

E.9.3.1.1. 并行查询
  • 并行查询 (Robert Haas, Amit Kapila, David Rowley, many others)

    使用9.6,PostgreSQL引入了对大型查询的并行执行的初始支持。 只有严格只读的查询,其中通过顺序扫描访问驱动表可以并行化。 哈希连接和嵌套循环可以并行执行,聚合(支持的聚合)也可以。 还有很多事情要做,但这已经是一个有用的功能集。

    默认情况下,并行查询执行尚未启用。要允许它,请将新配置参数 max_parallel_workers_per_gather设置为大于零的值。 通过其他新配置参数force_parallel_modeparallel_setup_costparallel_tuple_costmin_parallel_relation_size可以对并行性的使用进行其他控制。

  • 提供用于标记功能的并行安全状态的基础设施 (Robert Haas, Amit Kapila)

E.9.3.1.2. 索引
  • 允许GIN索引构建, 有效使用大于1GB的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.9.3.1.3. 排序
  • 在执行额外的排序步骤时,通过使用快速排序提升排序性能,而不是替换选择排序 (Peter Geoghegan)

    新方法更好的使用典型缓存大小和数据卷的CPU缓存。必要时, 可以通过新的配置参数replacement_sort_tuples调整行为。

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

  • 通过使用缩写的的关键字加速uuidbyteachar(n)字段的排序 (Peter Geoghegan)

    缩写关键字的支持还添加到了非缺省操作符类text_pattern_opsvarchar_pattern_opsbpchar_pattern_ops。 顺序集聚合的处理现在也可以利用缩写关键字。

  • 通过在排序期间将TID看做64位整数加速 CREATE INDEX CONCURRENTLY (Peter Geoghegan)

E.9.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.9.3.1.5. 优化器状态
  • 改善ANALYZE对拥有许多空值的字段的估计 (Tomas Vondra, Alex Shulgin)

    以前ANALYZE往往低估了具有许多NULL列中的非 NULL不同值的数量,并且在计算最常见的值时也不准确。

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

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

    如果表t拥有一个外键约束,(a,b) REFERENCES r (x,y), 那么WHERE条件,比如t.a = r.x AND t.b = r.y, 每t行不能选择超过r行。规划器以前认为这些AND 条件是独立的,并且经常会明显错误地估计选择性。现在它将WHERE 条件与适用的外键约束进行比较,并产生更好的估计。

E.9.3.1.6. VACUUM
  • 避免重新清空仅包含冻结元组的页面 (Masahiko Sawada, Robert Haas, Andres Freund)

    以前,防封装清理不得不访问表的每一页,甚至没有什么可做的页面。 现在,仅包含已冻结元组的页面在表的可见性映射中被标识, 并且即使在执行事务回绕预防时也可以跳过清理。 这应该大大降低维护包含大部分不变数据的大表的成本。

    如果需要,可以使用新的DISABLE_PAGE_SKIPPING 选项强制使用vacuum来处理所有冻结的页面。通常这应该永远不需要, 但它可能有助于从可见性映射损坏中恢复。

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

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

E.9.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_afterbgwriter_flush_aftercheckpoint_flush_afterwal_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)

  • 提高timestamptimedate 数据类型的输出函数的速度 (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.9.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的各种编译时配置信息。

  • 添加confirmed_flush_lsn字段到pg_replication_slots 系统视图 (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.9.3.1.9. 认证
  • 添加BSD认证方法 允许使用BSD认证服务进行 PostgreSQL客户端认证 (Marisa Emerson)

    BSD认证目前仅在OpenBSD上可用。

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

  • 在postmaster日志中提供详细信息,以了解更多类型的密码身份验证失败 (Tom Lane)

    所有通常可访问的密码认证失败情况现在应该在日志中提供特定的 DETAIL字段。

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

  • 添加新的SSPI 认证参数 compat_realmupn_username, 控制在SSPI认证期间是否使用NetBIOSKerberos域名和用户名 (Christian Ullrich)

E.9.3.1.10. 服务器配置
  • 允许会话在处于闲置事务状态的时间过长时自动终止 (Vik Fearing)

    这个行为是通过新的配置参数idle_in_transaction_session_timeout 控制的。它可以有效的防止忘记的事务持有锁或防止vacuum清理太长时间。

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

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

  • 添加log_line_prefix选项%n 以Unix纪元格式打印当前时间,以毫秒为单位 (Tomas Vondra, Jeff Davis)

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

  • 合并wal_level配置参数的archivehot_standby值到一个新值replica (Peter Eisentraut)

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

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

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

  • 如果服务器的SSL密钥文件由root所有, 允许其具有组读取访问权限 (Christoph Berg)

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

E.9.3.1.11. 可靠性
  • 如果postmaster死机,则强制后端退出 (Rajeev Rastogi, Robert Haas)

    在正常情况下,postmaster应该总是超过其子进程。 如果由于某种原因postmaster死机,强制后端会话退出并出错。以前, 现有的后端将继续运行,直到客户端断开连接,但这是不安全和低效的。 它还防止新的postmaster在最后一个旧后端退出之前启动。 后端将在等待客户端I/O时检测到postmaster死亡,因此退出不会是即时的, 但应该在当前查询结束之前发生。

  • 在报告约束违规故障之前检查可序列化冲突 (Thomas Munro)

    当使用可序列化事务隔离时, 希望由于并发事务导致的任何错误应该表现为序列化失败, 从而提示应用程序重试可能会成功。不幸的是, 这并不可靠发生在由并发插入引起的重复键失败。 此更改确保如果应用程序在事务中较早地显式检查是否存在冲突密钥 (并且没有找到它),则此类错误将报告为序列化错误。

  • 确保无效消息记录在WAL中,即使由未分配XID的事务发出 (Andres Freund)

    这修复了备用服务器上的事务无法注意到更改(例如新索引)的一些情况。

  • 防止多个进程同时尝试清除GIN索引的挂起列表 (Teodor Sigaev, Jeff Janes)

    这是故意允许的,但它会导致竞争条件,可能导致vacuum缺少需要删除的索引条目。

E.9.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都可用。

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

    这让pg_basebackup使用为WAL流定义的复制槽。 在基本备份完成后,为常规流复制选择相同的插槽允许新备用服务器的无缝启动。

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

E.9.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.9.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)

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

  • 在设置填充因子和自动清空相关的关系选项时,降低ALTER TABLE 所需的锁定强度 (Fabrízio de Royes Mello, Simon Riggs)

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

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

  • 如果任何源表有OID字段,则CREATE TABLE ... LIKE 包含一个OID列 (Bruce Momjian)

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

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

  • 修复DROP OPERATOR以清除 pg_operator.oprcompg_operator.oprnegate到废弃运算符的链接 (Roma Sokolov)

    以前这样的链接保持原样,这可能在不太可能发生的事件中引起问题, 即废弃运算符的OID被重用于另一运算符。

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

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

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

    这样的索引从来不被认为是支持的,并且将非常可能不正确, 因为系统可以改变元组的系统列字段而不更新索引。但是, 以前没有错误检查来阻止它们被创建。

E.9.3.5. 权限管理

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

    以前,许多安全敏感的函数包含硬线检查,如果它们被非超级用户调用会抛出错误。 这迫使对一些相对普通任务使用超级用户角色。硬连线错误检查现在已不再有利于使 initdb撤销对这些函数的默认公共EXECUTE特权。 这允许安装程序选择将此类函数的使用授予不需要所有超级用户权限的受信任角色。

  • 创建一些内置角色, 可用于授予对先前仅超级用户功能的访问权限 (Stephen Frost)

    目前唯一的这样的角色是pg_signal_backend, 但预期将来会有更多的被添加。

E.9.3.6. 数据类型

  • 改进全文搜索以支持搜索短语,也就是, 按照特定顺序或者特定距离彼此相邻的词素 (Teodor Sigaev, Oleg Bartunov, Dmitry Ivanov)

    可以使用新的运算符<-><N>tsquery输入中指定短语搜索查询。 前者意味着它之前和之后的词位必须以该顺序彼此相邻。后者意味着它们必须正好相隔 N个词。

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

    省略的边界被视为相应数组下标的上限或下限。 这允许对于许多常见用例的更简单的规范。

  • 更加注意超出范围的日期和时间戳 (Vitaly Burovoy)

    对于非常接近实现限制的timestamp with time zone值, 此更改防止意外的超出范围错误。以前,相同 值可能会被接受或不被接受,这取决于timezone设置, 意味着转储和重新加载可能在提交时已接受的值上失败。现在, 根据等效的UTC时间而不是本地时间强制实施限制, 以便独立于timezone

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

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

    这样的值现在打印出来总是与在一个简单的float8列中相同, 并且在输入上接受相同的方式。以前的行为是平台相关的。

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

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

    后备约束就像前瞻约束,因为它不消耗任何文本; 但是它检查字符串中在当前点结束的匹配的存在(或不存在), 而不是从当前点开始的匹配。类似的特征存在于许多其他正则表达式引擎中。

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

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

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

E.9.3.7. 函数

  • 添加jsonb_insert() 函数将一个新元素插入到一个jsonb数组中, 或者一个先前不存在的键插入到jsonb对象中 (Dmitry Dolgov)

  • 提高类型numericln()log()exp()pow()函数的精度 (Dean Rasheed)

  • 添加scale(numeric) 函数,提取numeric值的显示比例 (Marko Tiikkaja)

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

    例如,sind() 以度为单位度量其参数,而sin()以弧度度量。 这些函数需要一些长度,为值提供准确的结果,其中有可以预期的确切结果, 例如sind(30) = 0.5

  • 确保三角函数根据POSIX标准处理infinityNaN输入 (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(),计算它们的参数为null或非null的数量 (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)

    以前,负数没有缩写,只是以字节打印。

  • 添加一个可选的missing_ok参数到current_setting() 函数 (David Christensen)

    这允许避免无法识别的参数名称的错误,返回NULL

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

    如果给定一个无效的视图OIDpg_get_viewdef() 现在返回NULL,并且几个类似的函数同样对坏的输入返回NULL。 以前,这种情况通常导致缓存查找失败错误,这不意味着在面向用户的情况下发生。

  • 修复pg_replication_origin_xact_reset() 为没有任何参数 (Fujii Masao)

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

E.9.3.8. 服务器端语言

  • PL/pgSQL中,在编译函数时检测不匹配的 CONTINUEEXIT语句,而不是在执行时 (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的object 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.9.3.9. 客户端接口

  • 在错误和通知消息中添加严重性字段 的非本地化版本 (Tom Lane)

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

  • libpq中引入一个特性,从而可以抑制消息的 CONTEXT字段,否则总是或仅针对非错误消息 (Pavel Stehule)

    PQerrorMessage() 的默认行为现在只打印错误的CONTEXT。新的函数 PQsetErrorContextVisibility() 可以用来调整这个行为。

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

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

  • 改进libpqPQhost()函数以返回有用的数据, 用于默认的Unix套接字连接 (Tom Lane)

    以前,如果没有给出显式主机规范,它将返回NULL; 现在它返回默认的套接字目录路径。

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

E.9.3.10. 客户端应用

  • 添加--strict-names选项到pg_dumppg_restore (Pavel Stehule)

    如果没有与-t-n选项的匹配, 则此选项会导致程序出现错误,而不是静默执行。

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

    虽然超级用户始终可以更改内置或扩展创建对象的特权分配, 但此类更改以前在转储和重新加载中丢失。现在,pg_dump 识别和转储这样的更改。(这只适用于从9.6或更高版本的服务器转储时)。

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

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

  • pg_dump输出中,在对象类型的对象标记中包含表名称, 这些对象类型仅对每个表进行唯一命名(例如,触发器) (Peter Eisentraut)

E.9.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.9.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)不是线程数(-t)的确切倍数 (Fabien Coelho)

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

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

E.9.3.11. 服务器应用

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

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

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

  • 改进pg_rewind, 以便在目标时间线更改时可以工作 (Alexander Korotkov)

    这允许,例如将提升的备用服务器倒回到旧主控器的时间线的某个状态。

E.9.3.12. 源代码

  • 删除废弃的 heap_formtuple/heap_modifytuple/heap_deformtuple 函数 (Peter Geoghegan)

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

    为了支持使用新的宏ALLOCSET_DEFAULT_SIZESALLOCSET_SMALL_SIZESALLOCSET_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现代化, 看起来更像我们为外部数据包装器和表样本处理器采用的设计。 这简化了C代码,使得在可安装扩展中定义索引访问方法更加实用。 结果是pg_am系统目录的大多数列都消失了。添加了新的 检查函数, 以允许SQL查询确定以前可从pg_am发现的索引AM属性。

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

    这种架构允许pg_dump 转储安装可能在附加到系统对象的权限中进行的更改。以前, 这样的更改将在转储和重新加载中丢失,但现在它们被保留。

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

    RequestAddinLWLocks()函数被删除,并被 RequestNamedLWLockTranche()替换。 这允许更好地识别自定义LWLocks,并且不太容易出错。

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

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

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

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

    这种改变目前只提供边缘的用户可见的改进,但它使未来的工作在很多计划上的改进, 使用旧的代码结构是不切实际的。

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

    该改变允许将聚合函数的计算分割成单独的部分, 例如使得并行工作进程可以在计算聚合上协作。在将来, 它可能允许跨本地和远程数据的聚合部分地发生在远程端。

  • 添加通用命令进度报告工具 (Vinayak Pokale, Rahila Syed, Amit Langote, Robert Haas)

  • 分理出psqlflex lexer, 使其可以被其他客户端程序使用 (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.9.3.13. 附加模块

  • 添加配置参数auto_explain.sample_rate以允许 contrib/auto_explain 仅捕获所有查询的可配置部分 (Craig Ringer, Julien Rouhaud)

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

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

    这主要是非核心索引访问方法的概念验证,但它可以在其自身的查询搜索许多列时有用。

  • contrib/cube中, 为立方体引入距离运算符,并支持在多维数据集列的GiST索引中进行kNN样式搜索 (Stas Kelvich)

  • contrib/hstorehstore_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/pageinspectheap_page_items()函数显示每个元组中的原始数据, 并添加新的函数tuple_data_split()heap_page_item_attrs()以检查单个元组字段 (Nikolay Shaplov)

  • contrib/pgcryptopgp_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)

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

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

    当远程数据库中的兼容版本中存在扩展时,用户可以启用此功能。 它允许更有效地执行涉及扩展运算符的查询。

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

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

  • 如果可行,请在远程服务器上完全执行UPDATEDELETE (Etsuro Fujita)

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

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

    以前,postgres_fdw总是从远程查询一次取出100行;现在行为是可配置的。

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

  • 将查询取消请求发送到远程服务器 (Michael Paquier, Etsuro Fujita)

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