选择 打开 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

不受支持的版本: 9.3 / 9.2
历史版本PostgreSQL 9.3 已于 2018 年 11 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本手册首页

E.51. 版本 9.2 #

发行日期:. 2012-09-10

E.51.1. 概述

本版本主要聚焦于性能改进,但新的 SQL 特性也不缺乏。复制支持方面的工作也在继续。主要增强包括:

  • 允许查询只从索引检索数据,避免堆访问(仅索引扫描

  • 允许规划器即使在使用预备语句时,也为特定参数值生成定制计划

  • 改进规划器使用内层索引扫描的嵌套循环的能力

  • 允许流复制从库向其他从库转发数据(级联复制

  • 允许 pg_basebackup 从备库服务器做基础备份

  • 新增 pg_receivexlog 工具,用于在 WAL 文件变更写入时归档它们

  • 新增 SP-GiST(空间分区 GiST)索引访问方法

  • 新增对范围数据类型的支持

  • 新增 JSON 数据类型

  • 为视图新增 security_barrier 选项

  • 允许 libpq 连接串采用 URI 格式

  • libpq 新增单行处理模式,以更好地处理大型结果集

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

E.51.2. 迁移到版本 9.2

对于希望从任何早期版本迁移数据的用户,需要使用 pg_dump 进行转储/恢复,或者使用 pg_upgrade

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

E.51.2.1. 系统目录

  • pg_tablespace 中移除 spclocation 字段(Magnus Hagander)

    该字段与实际定义表空间位置的符号链接重复,因此在移动表空间时存在遗漏错误的风险。此变更允许在服务器停机期间通过手工调整符号链接来移动表空间目录。为了替代该字段,我们新增了 pg_tablespace_location() 来查询符号链接。

  • tsvector 的最常用元素统计移到 pg_stats 的新列中(Alexander Korotkov)

    对于 tsvector 列,此前在 most_common_valsmost_common_freqs 中可用的数据,请改查 most_common_elemsmost_common_elem_freqs

E.51.2.2. 函数

  • 移除 hstore=> 操作符(Robert Haas)

    用户现在应使用 hstore(text, text)。自 PostgreSQL 9.0 起,创建名为 => 的操作符时会发出警告消息,因为 SQL 标准将该记号保留作其他用途。

  • 确保 xpath() 对字符串值中的特殊字符转义(Florian Pflug)

    否则结果有可能不是有效的 XML

  • pg_relation_size() 及相关函数在对象不存在时返回 NULL(Phil Sorber)

    这防止了调用这些函数的查询在并发 DROP 之后立即返回错误。

  • EXTRACT(EPOCH FROM timestamp without time zone) 从本地午夜而不是 UTC 午夜起算纪元(Tom Lane)

    此变更撤销了 7.3 版本中一个欠考虑的变更。从 UTC 午夜起算是不一致的,因为它使结果依赖于 timezone 设置,而 timestamp without time zone 的计算不应如此。把输入值转换为 timestamp with time zone 仍可获得先前的行为。

  • 正确解析带尾缀 yesterdaytodaytomorrow 的时间串(Dean Rasheed)

    此前,SELECT '04:00:00 yesterday'::timestamp 返回的是昨天午夜的日期。

  • 修复 to_date()to_timestamp(),使不完整日期向 2020 年折算(Bruce Momjian)

    此前,少于四位的提供年份和年份掩码的折算不一致。

E.51.2.3. 对象修改

  • 防止 ALTER DOMAIN 作用于非域类型(Peter Eisentraut)

    此前在非域类型上可以更改所有者和模式。

  • 不再在 CREATE FUNCTION 中强制小写过程语言名(Robert Haas)

    虽然不带引号的语言标识符仍会小写,但字符串和带引号的标识符不再被强制小写。因此例如 CREATE FUNCTION ... LANGUAGE 'C' 将不再有效;必须写成 'c',或者最好省略引号。

  • 更改外键强制触发器的系统生成名称(Tom Lane)

    此变更确保在某些涉及自引用外键约束的极端情况下触发器按正确顺序触发。

E.51.2.4. 命令行工具

  • psql 元命令参数提供一致的反引号、变量展开和带引号子串行为(Tom Lane)

    此前,当这类引用与相邻文本之间没有空白分隔时,处理方式很奇怪。例如 'FOO'BAR 会输出为 FOO BAR(意外插入空格),而 FOO'BAR'BAZ 会原样输出(不像大多数人期望的那样去掉引号)。

  • 不再把 clusterdb 的表名视为已加双引号;不再把 reindexdb 的表名和索引名视为已加双引号(Bruce Momjian)

    如果需要加引号,用户现在必须在命令参数中包含双引号。

  • createuser 默认不再提示输入选项设置(Peter Eisentraut)

    使用 --interactive 获得旧行为。

  • 除非指定 --interactive,否则禁用 dropuser 中的用户名提示(Peter Eisentraut)

E.51.2.5. 服务器设置

  • 新增用于指定服务器端 SSL 文件位置的服务器参数(Peter Eisentraut)

    这允许更改此前在数据目录中硬编码为 server.crtserver.keyroot.crtroot.crl 的文件的名称和位置。服务器默认不再检查 root.crtroot.crl;要加载这些文件,必须把相关参数设为非默认值。

  • 移除 silent_mode 参数(Heikki Linnakangas)

    类似的行为可以用 pg_ctl start -l postmaster.log 获得。

  • 移除 wal_sender_delay 参数,因为它不再需要(Tom Lane)

  • 移除 custom_variable_classes 参数(Tom Lane)

    该设置提供的检查价值存疑。现在任何设置都可以以任何类名为前缀。

E.51.2.6. 监控

  • pg_stat_activity.procpid 重命名为 pid,以与其他系统表一致(Magnus Hagander)

  • pg_stat_activity 创建单独的列来报告进程状态(Scott Mead、Magnus Hagander)

    先前的 queryquery_start 值现在对空闲会话仍然可用,从而支持更强的分析。

  • pg_stat_activity.current_query 重命名为 query,因为它在查询完成后不会被清除(Magnus Hagander)

  • 把所有 SQL 级统计计时值改为以毫秒计的 float8 列(Tom Lane)

    此变更消除了设计中"值精确到微秒且仅到微秒"的假设(因为 float8 值可以带小数)。受影响的列有 pg_stat_user_functions.total_timepg_stat_user_functions.self_timepg_stat_xact_user_functions.total_timepg_stat_xact_user_functions.self_time。这些列底层的统计函数现在也返回 float8 毫秒而不是 bigint 微秒。contrib/pg_stat_statementstotal_time 列现在也以毫秒计。

E.51.3. 变更

下面是PostgreSQL 9.2 与上一个主版本之间变更的详细说明。

E.51.3.1. 服务器

E.51.3.1.1. 性能
  • 允许查询只从索引检索数据,避免堆访问(Robert Haas、Ibrar Ahmed、Heikki Linnakangas、Tom Lane)

    此特性常称为仅索引扫描。对于只包含对所有会话可见的元组的堆页(由可见性映射报告),可以跳过堆访问;因此该收益主要适用于基本静态的数据。作为实现此特性的必要部分,可见性映射被做成了崩溃安全的。

  • 新增 SP-GiST(空间分区 GiST)索引访问方法(Teodor Sigaev、Oleg Bartunov、Tom Lane)

    SP-GiST 在灵活性上与 GiST 相当,但支持非平衡的分区搜索结构而不是平衡树。对于合适的问题,SP-GiST 在索引构建时间和搜索时间上都可以比 GiST 更快。

  • 允许组提交在高负载下有效工作(Peter Geoghegan、Simon Riggs、Heikki Linnakangas)

    此前,随着写负载增加,由于内部锁竞争,提交批处理变得无效。

  • 允许无竞争锁使用新的快速路径锁机制管理(Robert Haas)

  • 降低创建虚拟事务 ID 锁的开销(Robert Haas)

  • 降低可序列化隔离级别锁的开销(Dan Ports)

  • 改进 PowerPC 和 Itanium 上的自旋锁性能(Manabu Ori、Robert Haas、Tom Lane)

  • 降低共享失效缓存消息的开销(Robert Haas)

  • PGPROC 共享内存数组中频繁访问的成员移到单独的数组中(Pavan Deolasee、Heikki Linnakangas、Robert Haas)

  • 通过批量向堆添加元组来改进 COPY 性能(Heikki Linnakangas)

  • 通过以更少的内存分配开销生成更好的树,改进几何数据类型的 GiST 索引性能(Alexander Korotkov)

  • 改进 GiST 索引构建时间(Alexander Korotkov、Heikki Linnakangas)

  • 允许临时表和不记录日志的表更早设置提示位(Robert Haas)

  • 允许排序由内联的、不可从 SQL 调用的比较函数执行(Peter Geoghegan、Robert Haas、Tom Lane)

  • 使 CLOG 缓冲区数量基于 shared_buffers 缩放(Robert Haas、Simon Riggs、Tom Lane)

  • 改进删除表或数据库时发生的缓冲池扫描的性能(Jeff Janes、Simon Riggs)

  • 改进删除或截断大量表时检查点进程 fsync 请求队列的性能(Tom Lane)

  • 在 Windows 上把安全的文件描述符数量传递给子进程(Heikki Linnakangas)

    这允许 Windows 会话使用比以前更多的打开文件描述符。

E.51.3.1.2. 进程管理
  • 创建专门的后台进程来执行检查点(Simon Riggs)

    此前后台写入进程既写脏页又做检查点。把这两项工作分到两个进程使每个目标都能更可预期地完成。

  • 通过更早唤醒 walwriter 来改进异步提交行为(Simon Riggs)

    此前只有 wal_writer_delay 触发 WAL 刷盘;现在填满 WAL 缓冲区也会触发 WAL 写入。

  • 允许 bgwriter、walwriter、checkpointer、统计收集器、日志收集器和归档器等后台进程在空闲期间更高效地休眠(Peter Geoghegan、Tom Lane)

    这一系列变更降低了无事可做时进程唤醒的频率,大幅降低了空闲服务器的功耗。

E.51.3.1.3. 优化器
  • 允许规划器即使在使用预备语句时,也为特定参数值生成定制计划(Tom Lane)

    过去,预备语句总是只有一个用于所有参数值的通用计划,它常常远不如用于包含显式常量值的非预备语句的计划。现在,规划器会尝试为特定参数值生成定制计划。只有当定制计划反复被证明没有收益时,才会使用通用计划。此变更应能消除此前使用预备语句(包括 PL/pgSQL 中的非动态语句)所见的性能损失。

  • 改进规划器使用内层索引扫描的嵌套循环的能力(Tom Lane)

    新的参数化路径机制允许内层索引扫描使用来自比扫描高多个连接层级的关系的值。在语义限制(如外连接)限定允许连接顺序的情况下,这可以大幅提升性能。

  • 改进外部数据包装器的规划 API(Etsuro Fujita、Shigeru Hanada、Tom Lane)

    包装器现在可以为其表提供多个访问路径,使连接规划更加灵活。

  • 识别非表关系的自相矛盾限定子句(Tom Lane)

    只有当 constraint_exclusionon 时才执行此检查。

  • 允许 indexed_col op ANY(ARRAY[...]) 条件用于普通索引扫描和仅索引扫描(Tom Lane)

    此前这类条件只能用于位图索引扫描。

  • 支持在 boolean 列上使用 MIN/MAX 索引优化(Marti Raudsepp)

  • 在设置行数估计时,把 SELECT 目标列表中的集合返回函数考虑在内(Tom Lane)

  • 修复规划器,使其更可靠地处理含重复列的索引(Tom Lane)

  • 收集并使用数组的元素频率统计(Alexander Korotkov、Tom Lane)

    此变更改进了数组 <@&&@> 操作符(数组包含和重叠)的选择率估计。

  • 允许为外部表收集统计信息(Etsuro Fujita)

  • 改进使用部分索引的代价估计(Tom Lane)

  • 改进规划器对子查询中引用列使用统计信息的能力(Tom Lane)

  • 改进对使用 DISTINCT 的子查询的统计估计(Tom Lane)

E.51.3.1.4. 认证
  • 不再把 pg_hba.conf 中指定的角色名和 samerole 视为自动包含超级用户(Andrew Dunstan)

    这使得把 reject 行用于组角色更加容易。

  • 调整 pg_hba.conf 处理,使记号解析更一致(Brendan Jurd、[Aacute]lvaro Herrera)

  • 不允许空的 pg_hba.conf 文件(Tom Lane)

    这样做是为了更快地检测配置错误。

  • 让超级用户权限隐含复制权限(Noah Misch)

    这避免了显式分配此类权限的需要。

E.51.3.1.5. 监控
  • 在后端崩溃时尝试记录当前查询串(Marti Raudsepp)

  • 让自动清理 I/O 活动的日志更详细(Greg Smith、Noah Misch)

    此日志由 log_autovacuum_min_duration 触发。

  • WAL 重放更早报告失败(Fujii Masao)

    有些情况下,失败直到服务器进入主库模式才被报告。

  • 新增 pg_xlog_location_diff(),简化 WAL 位置比较(Euler Taveira de Oliveira)

    这对于计算复制延迟很有用。

  • 支持在 Windows 上配置事件日志应用名(MauMau、Magnus Hagander)

    这允许不同实例通过设置 event_source 服务器参数以不同标识符使用事件日志,其工作方式类似于 syslog_ident

  • unexpected EOF消息改为 DEBUG1 级别,存在未结束事务的情况除外(Magnus Hagander)

    此变更减少了以不优雅方式关闭数据库连接的应用所造成的日志噪音。

E.51.3.1.6. 统计视图
  • pg_stat_database 系统视图中跟踪临时文件大小和文件数量(Tomas Vondra)

  • pg_stat_database 系统视图新增死锁计数器(Magnus Hagander)

  • 新增服务器参数 track_io_timing,用于跟踪 I/O 计时(Ants Aasma、Robert Haas)

  • pg_stat_bgwriter 中报告检查点计时信息(Greg Smith、Peter Geoghegan)

E.51.3.1.7. 服务器设置
  • 静默忽略 search_path 中指定但不存在的模式(Tom Lane)

    这使得使用通用路径设置更方便,这类设置可能包含并非在所有数据库中都存在的模式。

  • 允许超级用户按会话设置 deadlock_timeout,而不仅是按集簇(Noah Misch)

    这允许对很可能卷入死锁的事务降低 deadlock_timeout,从而更快检测到失败。或者,提高该值可以降低会话因死锁而被选中取消的机会。

  • 新增服务器参数 temp_file_limit,用于限制每会话的临时文件空间使用(Mark Kirkwood)

  • 允许超级用户在加载相关扩展之前 SET 该扩展的仅超级用户自定义变量(Tom Lane)

    系统现在会记住 SET 是否由超级用户执行,以便在加载扩展时进行正确的权限检查。

  • postmaster 新增 -C 选项,用于查询配置参数(Bruce Momjian)

    这使 pg_ctl 能更好地处理 PGDATA-D 指向仅配置目录的情况。

  • CREATE DATABASE 中用隐含值替换空的区域名(Tom Lane)

    这防止了 pg_database.datcollatedatctype 在服务器重启后被不同解释的情况。

E.51.3.1.7.1. postgresql.conf
  • 允许报告 postgresql.conf 中的多个错误,而不是只有第一个(Alexey Klyukin、Tom Lane)

  • 允许所有会话处理 postgresql.conf 的重新加载,即使某些设置对特定会话无效(Alexey Klyukin)

    此前,这类会话内无效的值会导致该会话忽略所有设置变更。

  • 为配置文件新增 include_if_exists 机制(Greg Smith)

    其工作方式与 include 相同,只是文件缺失时不抛出错误。

  • initdb 期间确定服务器时区,并相应地设置 postgresql.conf 中的 timezonelog_timezone 条目(Tom Lane)

    这避免了服务器启动期间昂贵的时区探测。

  • 修复 pg_settings,使其在 Windows 上报告 postgresql.conf 行号(Tom Lane)

E.51.3.2. 复制和恢复

  • 允许流复制从库向其他从库转发数据(级联复制)(Fujii Masao)

    此前,只有主服务器能向备库服务器提供流复制日志文件。

  • synchronous_commit 新增模式 remote_write(Fujii Masao、Simon Riggs)

    此模式等待备库服务器把事务数据写入其自身的操作系统,但不等待数据被刷到备库的磁盘。

  • 新增 pg_receivexlog 工具,在 WAL 文件变更写入时就归档,而不是等待 WAL 文件完成(Magnus Hagander)

  • 允许 pg_basebackup 从备库服务器做基础备份(Jun Ishizuka、Fujii Masao)

    此特性允许把制作新基础备份的工作从主库服务器上卸载。

  • 允许在 pg_basebackup 执行备份期间流式传输 WAL 文件(Magnus Hagander)

    这允许在 WAL 文件在主库上被丢弃之前传给备库。

E.51.3.3. 查询

  • 当客户端断开连接时取消正在运行的查询(Florian Pflug)

    如果后端在查询期间检测到客户端连接丢失,现在会取消该查询,而不是试图完成它。

  • 在运行时为行表达式保留列名(Andrew Dunstan、Tom Lane)

    此变更允许在行值转换为 hstorejson 类型时获得更好的结果:结果值的字段现在会具有预期的名称。

  • 改进子 SELECT 结果所用的列标签(Marti Raudsepp)

    此前使用的是通用标签 ?column?

  • 改进确定未知值类型的启发式规则(Tom Lane)

    "未知常量可以与使用它的操作符另一侧的值具有相同类型"这一长期规则,现在在考虑多态操作符时也会应用,而不仅用于简单的操作符匹配。

  • 对创建到域类型或从域类型出发的转换发出警告(Robert Haas)

    这类转换没有任何效果。

  • 当行违反 CHECKNOT NULL 约束时,把行的内容显示为错误细节(Jan Kundr[aacute]t)

    当插入或更新正在处理许多行时,这应能更容易识别哪一行有问题。

E.51.3.4. 对象操作

  • 提供并发 DDL 期间更可靠的操作(Robert Haas、Noah Misch)

    此变更增加了锁定,应能消除许多场景下的 cache lookup failed 错误。此外,也不再可能向正被并发删除的模式添加关系——这种场景以前会导致系统目录内容不一致。

  • DROP INDEX 新增 CONCURRENTLY 选项(Simon Riggs)

    这允许在不阻塞其他会话的情况下移除索引。

  • 允许外部数据包装器具有逐列选项(Shigeru Hanada)

  • 改进视图定义的漂亮打印(Andrew Dunstan)

E.51.3.4.1. 约束
  • 允许 CHECK 约束声明为 NOT VALID([Aacute]lvaro Herrera)

    添加 NOT VALID 约束不会导致扫描表以验证现有行满足约束。之后,新添加或更新的行会被检查。规划器在考虑 constraint_exclusion 时会忽略这类约束,因为不能确定所有行都满足约束。

    新的 ALTER TABLE VALIDATE 命令允许对现有行检查 NOT VALID 约束,之后它们被转换为普通约束。

  • 允许 CHECK 约束声明为 NO INHERIT(Nikhil Sontakke、Alex Hunsaker、[Aacute]lvaro Herrera)

    这使它们只在父表上强制执行,而不在子表上。

  • 新增重命名约束的能力(Peter Eisentraut)

E.51.3.4.2. ALTER
  • 减少某些 ALTER TABLE ... ALTER COLUMN TYPE 操作重建表和索引的需要(Noah Misch)

    增大 varcharvarbit 列的长度限制,或者完全移除限制,不再需要重写表。类似地,增大 numeric 列允许的精度,或者把列从受约束的 numeric 改为不受约束的 numeric,也不再需要重写表。在涉及 intervaltimestamptimestamptz 类型的类似情况下,也可以避免重写表。

  • 避免 ALTER TABLE 在某些不必要的情况下重新验证外键约束(Noah Misch)

  • 为一些 ALTER 命令新增 IF EXISTS 选项(Pavel Stehule)

    例如 ALTER FOREIGN TABLE IF EXISTS foo RENAME TO bar

  • 新增 ALTER FOREIGN DATA WRAPPER ... RENAMEALTER SERVER ... RENAME(Peter Eisentraut)

  • 新增 ALTER DOMAIN ... RENAME(Peter Eisentraut)

    此前已可以用 ALTER TYPE 重命名域。

  • ALTER DOMAIN ... DROP CONSTRAINT 在约束不存在时抛出错误(Peter Eisentraut)

    已新增 IF EXISTS 选项来提供先前的行为。

E.51.3.4.3. CREATE TABLE
  • 允许从外部表、视图和组合类型执行 CREATE TABLE (LIKE ...)(Peter Eisentraut)

    例如,这允许创建一个模式与某个视图匹配的表。

  • 修复 CREATE TABLE (LIKE ...),避免复制索引注释时的索引名冲突(Tom Lane)

  • 修复 CREATE TABLE ... AS EXECUTE,使其处理 WITH NO DATA 和列名指定(Tom Lane)

E.51.3.4.4. 对象权限
  • 为视图新增 security_barrier 选项(KaiGai Kohei、Robert Haas)

    此选项防止可能向用户暴露视图保护数据的优化,例如把涉及不安全函数的子句下推到视图的 WHERE 子句。这类视图的性能预计会比普通视图差。

  • 新增 LEAKPROOF 函数属性,用于标记可以安全下推到 security_barrier 视图的函数(KaiGai Kohei)

  • 新增对数据类型权限的支持(Peter Eisentraut)

    这新增了对类型和域上符合 SQL 标准的 USAGE 权限的支持。其意图是能够限制哪些用户可以在类型上创建依赖,因为这类依赖会限制所有者更改类型的能力。

  • SELECT INTO / CREATE TABLE AS 中检查 INSERT 权限(KaiGai Kohei)

    由于对象是由 SELECT INTOCREATE TABLE AS 创建的,创建者通常应拥有插入权限;但存在一些例外情况,例如 ALTER DEFAULT PRIVILEGES 移除了这类权限时。

E.51.3.5. 工具操作

  • 允许 VACUUM 更容易地跳过无法锁定的页面(Simon Riggs、Robert Haas)

    此变更应能大幅减少 VACUUM 因等待其他会话而卡住的情况。

  • EXPLAIN (BUFFERS) 统计被弄脏和写出的块(Robert Haas)

  • EXPLAIN ANALYZE 报告被过滤步骤拒绝的行数(Marko Tiikkaja)

  • 允许 EXPLAIN ANALYZE 在不需要时间值时避免计时开销(Tomas Vondra)

    这通过把新的 TIMING 选项设为 FALSE 实现。

E.51.3.6. 数据类型

  • 新增对范围数据类型的支持(Jeff Davis、Tom Lane、Alexander Korotkov)

    范围数据类型存储属于其基础类型的下界和上界。它支持包含、重叠和交集等操作。

  • 新增 JSON 数据类型(Robert Haas)

    该类型存储经过正确验证的 JSON(JavaScript 对象表示法)数据。

  • 新增 array_to_json()row_to_json()(Andrew Dunstan)

  • 新增 SMALLSERIAL 数据类型(Mike Pultz)

    它类似于 SERIAL,只是把序列存储在两字节整数列(int2)中。

  • 允许声明为 NOT VALID([Aacute]lvaro Herrera)

    此选项可以在创建域时设置,或者通过 ALTER DOMAIN ... ADD CONSTRAINT ... NOT VALID 设置。ALTER DOMAIN ... VALIDATE CONSTRAINT 会完全验证约束。

  • money 数据类型支持更多区域特定的格式化选项(Tom Lane)

    具体而言,遵循 POSIX 中关于货币输出中值、符号和货币符号顺序的所有选项。此外,确保千位分隔符只插入在小数点左侧,这是 POSIX 的要求。

  • macaddr 数据类型新增按位操作符(Brendan Jurd)

  • 允许 xpath() 在给定标量值时返回单元素 XML 数组(Florian Pflug)

    此前它返回空数组。此变更还会使 xpath_exists() 对这类表达式返回真而不是假。

  • 改进 XML 错误处理的健壮性(Florian Pflug)

E.51.3.7. 函数

  • 允许非超级用户对属于同一用户的其他会话使用 pg_cancel_backend()pg_terminate_backend()(Magnus Hagander、Josh Kupershmidt、Dan Farina)

    此前只有超级用户可以使用这些函数。

  • 允许导入和导出事务快照(Joachim Wieland、Tom Lane)

    这允许多个事务共享相同的数据库状态视图。快照通过 pg_export_snapshot() 导出,并通过 SET TRANSACTION SNAPSHOT 导入。只能导入来自当前正在运行的事务的快照。

  • 支持对表达式使用 COLLATION FOR(Peter Eisentraut)

    它返回一个表示该表达式排序规则的字符串。

  • 新增 pg_opfamily_is_visible()(Josh Kupershmidt)

  • 新增 pg_size_pretty()numeric 变体,供 pg_xlog_location_diff() 使用(Fujii Masao)

  • 新增 pg_trigger_depth() 函数(Kevin Grittner)

    它报告当前触发器调用深度。

  • 允许 string_agg() 处理 bytea 值(Pavel Stehule)

  • 修复反向引用出现在更大的带量词子表达式中的正则表达式(Tom Lane)

    例如 ^(\w+)( \1)+$。以前的版本不检查反向引用是否真的与第一次出现匹配。

E.51.3.8. Information Schema

  • 新增信息模式视图 role_udt_grantsudt_privilegesuser_defined_types(Peter Eisentraut)

  • 为信息模式 element_types 视图新增组合类型属性(Peter Eisentraut)

  • 在信息模式中实现 interval_type 列(Peter Eisentraut)

    此前这些列读取为空值。

  • 在信息模式 attributescolumnsdomainselement_types 视图中实现排序规则相关列(Peter Eisentraut)

  • 在信息模式 table_privileges 视图中实现 with_hierarchy 列(Peter Eisentraut)

  • 在信息模式中新增序列 USAGE 权限的显示(Peter Eisentraut)

  • 让信息模式显示默认权限(Peter Eisentraut)

    此前,非空的默认权限没有在视图中表示。

E.51.3.9. 服务器端语言

E.51.3.9.1. PL/pgSQL Server-Side Language
  • 允许 PL/pgSQL 的 OPEN 游标命令按名称提供参数(Yeb Havinga)

  • 新增 PL/pgSQL 命令 GET STACKED DIAGNOSTICS,用于获取异常信息(Pavel Stehule)

  • 通过缓存类型信息加速 PL/pgSQL 数组赋值(Pavel Stehule)

  • 改进长链 ELSIF 子句的性能和内存消耗(Tom Lane)

  • 让 PL/pgSQL 错误消息输出函数签名而不仅是名称(Pavel Stehule)

E.51.3.9.2. PL/Python Server-Side Language
  • 新增 PL/Python 的 SPI 游标支持(Jan Urbanski)

    这允许 PL/Python 读取部分结果集。

  • 为 PL/Python 新增结果元数据函数(Peter Eisentraut)

    具体而言,这新增了结果对象函数 .colnames.coltypes.coltypmods

  • 移除对 Python 2.2 的支持(Peter Eisentraut)

E.51.3.9.3. SQL Server-Side Language
  • 允许 SQL 语言函数按名称引用参数(Matthew Draper)

    要使用此特性,只需为函数参数命名,然后在 SQL 函数体中引用参数名。

E.51.3.10. 客户端应用程序

  • initdb 新增选项 --auth-local--auth-host(Peter Eisentraut)

    这允许分别控制 pg_hba.conflocalhost 的认证设置。--auth 仍然同时控制两者。

  • createuser 新增 --replication/--no-replication 标志,用于控制复制权限(Fujii Masao)

  • dropdbdropuser 新增 --if-exists 选项(Josh Kupershmidt)

  • 使命令行工具能够指定要连接的数据库名,并在连接 postgres 数据库失败时回退到 template1(Robert Haas)

E.51.3.10.1. psql
  • 新增根据显示宽度自动扩展输出的显示模式(Peter Eisentraut)

    这为 \x 命令新增了 auto 选项,当普通输出会比屏幕更宽时切换到扩展模式。

  • 允许包含相对于调用文件所在目录命名的脚本文件(Gurjeet Singh)

    这通过新命令 \ir 实现。

  • 支持 psql 变量名中的非 ASCII 字符(Tom Lane)

  • 新增对特定大版本的 .psqlrc 文件的支持(Bruce Momjian)

    psql 此前已支持特定小版本的 .psqlrc 文件。

  • 提供用环境变量覆盖 psql 历史和启动文件位置的能力(Andrew Dunstan)

    如果设置了 PSQL_HISTORYPSQLRC,现在将由它们决定这些文件名。

  • 新增 \setenv 命令,用于修改传递给子进程的环境变量(Andrew Dunstan)

  • psql 的临时编辑器文件使用 .sql 扩展名(Peter Eisentraut)

    这允许对扩展名敏感的编辑器选择正确的模式。

  • 允许 psql 使用零字节字段和记录分隔符(Peter Eisentraut)

    各种 shell 工具使用零字节(NUL)分隔符,例如 find

  • \timing 选项报告失败查询的耗时(Magnus Hagander)

    此前只对成功查询报告耗时。

  • 统一并收紧 psql\copy 和 SQL COPY 的处理(Noah Misch)

    此修复使失败行为更可预期,并遵循 \set ON_ERROR_ROLLBACK

E.51.3.10.2. 信息命令
  • \d 在序列上显示拥有它的表/列名(Magnus Hagander)

  • \d+ 中显示列的统计目标(Magnus Hagander)

  • \du 中显示角色口令过期日期(Fabr[iacute]zio de Royes Mello)

  • 显示转换、编码转换、域和语言的注释(Josh Kupershmidt)

    它们分别包含在 \dC+\dc+\dD+\dL 的输出中。

  • 显示 SQL/MED 对象的注释(Josh Kupershmidt)

    它们分别包含在外部服务器、外部表和外部数据包装器的 \des+\det+\dew+ 输出中。

  • 更改 \dd,使其只显示没有专属反斜杠命令的对象类型的注释(Josh Kupershmidt)

E.51.3.10.3. Tab 补全
  • psql Tab 补全中,按照新的 COMP_KEYWORD_CASE 设置以大写或小写补全 SQL 关键字(Peter Eisentraut)

  • 新增 EXECUTE 的 Tab 补全支持(Andreas Karlsson)

  • 允许 GRANT/REVOKE 中角色引用的 Tab 补全(Peter Eisentraut)

  • 允许文件名的 Tab 补全在必要时提供引号(Noah Misch)

  • 更改 TABLE 的 Tab 补全支持,使其也包含视图(Magnus Hagander)

E.51.3.10.4. pg_dump
  • pg_dump 新增 --exclude-table-data 选项(Andrew Dunstan)

    这允许按表只转储表的定义而不转储其数据。

  • pg_dumppg_restore 新增 --section 选项(Andrew Dunstan)

    有效值为 pre-datadatapost-data。该选项可以给出多次以选择两个或更多节。

  • pg_dumpall 先转储所有角色,再转储角色上的所有配置设置(Phil Sorber)

    这允许角色的配置设置提及其他角色而不产生错误。

  • 允许 pg_dumpall 在新集簇缺少 postgres 数据库时避免错误(Robert Haas)

  • 按用户名顺序转储外部服务器用户映射(Peter Eisentraut)

    这有助于产生确定性的转储文件。

  • 以可预测的顺序转储操作符(Peter Eisentraut)

  • 收紧 pg_dump 转储扩展配置表的规则(Tom Lane)

  • pg_dump 生成更有用的依赖信息(Tom Lane)

    归档格式转储中包含的依赖链接此前用处非常有限,因为它们经常引用转储中根本没有出现的对象。现在它们表示被转储对象之间的实际依赖(可能是间接的)。

  • 改进 pg_dump 转储大量数据库对象时的性能(Tom Lane)

E.51.3.11. libpq

  • 允许 libpq 连接串采用 URI 格式(Alexander Shulgin)

    语法以 postgres:// 开头。这允许应用避免为表示数据库连接的 URI 实现自己的解析器。

  • 新增用于禁用 SSL 压缩的连接选项(Laurenz Albe)

    这可用于消除快速网络上 SSL 压缩的开销。

  • 新增单行处理模式,以更好地处理大型结果集(Kyotaro Horiguchi、Marko Kreen)

    此前,libpq 总是先把整个查询结果收集到内存中,再传递回应用。

  • 为函数 PQconnectdbParamsPQconnectStartParamsPQpingParams 的声明添加 const 限定符(Lionel Elie Mamane)

  • 允许 .pgpass 文件的口令字段包含转义字符(Robert Haas)

  • 让库函数在需要终止进程时使用 abort() 而不是 exit()(Peter Eisentraut)

    这一选择不会干扰程序使用的正常退出码,并会生成可被调用方捕获的信号。

E.51.3.12. 源代码

  • 移除已死的平台(Peter Eisentraut)

    以下平台不再受支持:dgux、nextstep、sunos4、svr4、ultrix4、univel、bsdi。

  • 新增对使用 MS Visual Studio 2010 构建的支持(Brar Piening)

  • 支持使用 MinGW-w64 32 位编译器编译(Lars Kanis)

  • 安装时把 plpgsql.h 安装到 include/server(Heikki Linnakangas)

  • 改进闩锁机制,加入对 postmaster 死亡的检测(Peter Geoghegan、Heikki Linnakangas、Tom Lane)

    这消除了后台进程此前必须唤醒以轮询事件的主要原因之一。

  • 在支持的地方使用 C 弹性数组成员(Peter Eisentraut)

  • 改进并发事务回归测试(isolationtester)(Noah Misch)

  • 修改 thread_test,使其在当前目录而不是 /tmp 中创建测试文件(Bruce Momjian)

  • 改进 flex 和 bison 的警告与错误报告(Tom Lane)

  • 新增内存屏障支持(Robert Haas)

    目前尚未使用。

  • 修改 pgindent 以使用 typedef 文件(Bruce Momjian)

  • 新增用于处理即将发送到服务器日志的消息的钩子(Martin Pihlak)

  • DROP 命令新增对象访问钩子(KaiGai Kohei)

  • 集中化某些对象类型的 DROP 处理(KaiGai Kohei)

  • 新增 pg_upgrade 测试套件(Peter Eisentraut)

  • 把正则表达式代码与 TCL 8.5.11 同步,并改进内部处理(Tom Lane)

  • CRC 表移到 libpgport,并在单独的头文件中提供(Daniel Farina)

  • git_changelog 新增用于制作大版本发行说明的选项(Bruce Momjian)

  • 支持 Linux 的 /proc/self/oom_score_adj API(Tom Lane)

E.51.3.13. 附加模块

  • 通过使用 libpq 新的单行处理模式改进 dblink 的效率(Kyotaro Horiguchi、Marko Kreen)

    此改进不适用于 dblink_send_query()/dblink_get_result()

  • file_fdw 中支持 force_not_null 选项(Shigeru Hanada)

  • pg_archivecleanup 实现空运行模式(Gabriele Bartolini)

    它只输出要删除文件的名称。

  • pgbench 新增开关 --unlogged-tables--tablespace--index-tablespace(Robert Haas)

  • 更改 pg_test_fsync,使其按固定时长而不是固定周期数测试(Bruce Momjian)

    移除了 -o/cycles 选项,新增了 -s/seconds。

  • 新增 pg_test_timing 工具,用于测量时钟单调性和计时开销(Ants Aasma、Greg Smith)

  • 新增 tcn(触发式变更通知)模块,在表变更时生成 NOTIFY 事件(Kevin Grittner)

E.51.3.13.1. pg_upgrade
  • 调整 pg_upgrade 环境变量(Bruce Momjian)

    把数据、bin 和端口环境变量重命名为以 PG 开头,并支持 PGPORTOLD/PGPORTNEW 以取代 PGPORT

  • 彻底改造 pg_upgrade 的日志和失败报告(Bruce Momjian)

    创建四个只追加的日志文件,成功时删除它们。新增 -r/--retain 选项以无条件保留这些文件。同时移除 pg_upgrade-g/-G/-l 选项(已无必要),并收紧日志文件权限。

  • pg_upgrade 创建一个脚本,以增量方式生成更准确的优化器统计信息(Bruce Momjian)

    这减少了升级后生成最小集簇统计信息所需的时间。

  • 允许 pg_upgrade 升级没有 postgres 数据库的旧集簇(Bruce Momjian)

  • 允许 pg_upgrade 处理某些旧库或新库缺失的情况,只要它们是空的(Bruce Momjian)

  • 允许 pg_upgrade 处理仅配置目录的安装(Bruce Momjian)

  • pg_upgrade 中新增 -o/-O 选项,用于向服务器传递参数(Bruce Momjian)

    这对仅配置目录的安装很有用。

  • 更改 pg_upgrade,使其默认使用端口 50432(Bruce Momjian)

    这有助于避免升级期间意外的客户端连接。

  • 减少 pg_upgrade 中的集簇锁定(Bruce Momjian)

    具体而言,只有使用链接模式时才锁定旧集簇,并在模式恢复之后立即进行。

E.51.3.13.2. pg_stat_statements
  • 允许 pg_stat_statements 通过 SQL 文本归一化聚合相似查询(Peter Geoghegan、Tom Lane)

    使用非参数化 SQL 应用的用户现在无需详细的日志分析就能监控查询性能。

  • pg_stat_statements 新增脏块和写出块计数以及读写时间(Robert Haas、Ants Aasma)

  • 防止 pg_stat_statements 重复计数 PREPAREEXECUTE 命令(Tom Lane)

E.51.3.13.3. sepgsql
  • 支持在全局对象上使用 SECURITY LABEL(KaiGai Kohei、Robert Haas)

    具体而言,为数据库、表空间和角色添加安全标签。

  • 允许 sepgsql 遵循数据库标签(KaiGai Kohei)

  • 在各种对象创建期间执行 sepgsql 权限检查(KaiGai Kohei)

  • 新增 sepgsql_setcon() 及相关函数,用于控制 sepgsql 安全域(KaiGai Kohei)

  • 为 sepgsql 新增用户空间访问缓存以提升性能(KaiGai Kohei)

E.51.3.14. 文档

  • 新增规则,可选择使用网站样式表构建 HTML 文档(Magnus Hagander)

    使用 gmake STYLE=website draft

  • 改进 EXPLAIN 文档(Tom Lane)

  • 记录命令行工具(如 vacuumdb)通过双引号保留用户/数据库名(Bruce Momjian)

  • 记录客户端为 MD5 认证返回的实际字符串(Cyan Ogilvie)

  • 废弃在 CREATE TEMP TABLE 中使用 GLOBALLOCAL(Noah Misch)

    PostgreSQL 长期以来把这些关键字视为无操作,并将继续如此;但未来它们可能获得 SQL 标准所规定的含义,因此应用应避免使用它们。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。