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

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

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

E.24. 版本 9.0 #

发行日期

2010-09-20

E.24.1. 概述

这个 PostgreSQL 版本添加了人们多年来请求的特性,如易于使用的复制、批量权限修改工具以及匿名代码块。虽然过去的大版本在范围上偏保守,但本版本展现出提供 PostgreSQL 新老用户都会拥抱的功能的大胆新愿望。这一切都是在极少不兼容的情况下完成的。主要增强包括:

  • 基于日志传送的内建复制。这一进步由两个特性组成:流复制(允许通过网络连接把连续归档(WAL)文件流式传输到备库服务器)和热备(允许连续归档备库服务器执行只读查询)。最终效果是支持一主多只读从库。

  • 更简便的数据库对象权限管理。GRANT/REVOKE IN SCHEMA 支持对现有对象批量修改权限,而 ALTER DEFAULT PRIVILEGES 允许控制未来创建的对象的权限。大对象(BLOB)现在也支持权限管理。

  • 广泛增强的存储过程支持。DO 语句支持临时或匿名代码块。函数现在可以使用命名参数调用。PL/pgSQL 现在默认安装,PL/PerlPL/Python 在多个方面得到增强,包括对 Python3 的支持。

  • 64 位 Windows 的完整支持。

  • 更高级的报表查询,包括额外的窗口选项(PRECEDINGFOLLOWING)以及控制值被馈送给聚合函数的顺序的能力。

  • 新的触发器特性,包括符合 SQL 标准的逐列触发器和条件触发器执行。

  • 可延迟的唯一约束。现在无需技巧即可对唯一键做批量更新。

  • 排他约束。它们提供唯一约束的泛化版本,允许强制执行复杂条件。

  • 新增和增强的安全特性,包括 RADIUS 认证、LDAP 认证改进,以及用于测试口令强度的新 contrib 模块 passwordcheck

  • LISTEN/NOTIFY 特性的新高性能实现。未决事件现在存储在基于内存的队列而不是表中。此外,每个事件可以随附一个载荷字符串,而不是像以前那样只传递事件名。

  • VACUUM FULL 的新实现。该命令现在重写整个表和索引,而不是移动单个行来压缩空间。它在大多数情况下明显更快,而且不再导致索引膨胀。

  • 新 contrib 模块 pg_upgrade,支持从 8.3 或 8.4 就地升级到 9.0。

  • 针对特定类型查询的多项性能增强,包括消除不必要的连接。这有助于优化一些自动生成的查询,例如对象关系映射器(ORM)生成的查询。

  • EXPLAIN 增强。输出现在可采用 JSON、XML 或 YAML 格式,并包含缓冲区利用情况和其他以前无法获得的数据。

  • hstore 改进,包括新函数和更大的数据容量。

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

E.24.2. 迁移到版本 9.0

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

版本 9.0 包含一些为支持新特性和代码质量改进而有选择地破坏向后兼容性的变更。特别是,大量使用 PL/pgSQL、时间点恢复(PITR)或温备的用户应测试其应用,因为这些领域有轻微的用户可见变化。请注意以下不兼容之处:

E.24.2.1. 服务器设置

  • 移除服务器参数 add_missing_from(多年来默认关闭)(Tom Lane)

  • 移除服务器参数 regex_flavor(多年来默认为 advanced)(Tom Lane)

  • archive_mode 现在只影响 archive_command;新设置 wal_level 影响预写式日志的内容(Heikki Linnakangas)

  • log_temp_files 现在默认文件大小单位为千字节(Robert Haas)

E.24.2.2. 查询

  • 查询父表时,不再对作为查询一部分被扫描的子表做单独的权限检查(Peter Eisentraut)

    SQL 标准规定了这种行为,而且实践中它也比此前同时检查每个子表和父表权限的行为方便得多。

E.24.2.3. 数据类型

  • bytea 输出现在默认以十六进制格式显示(Peter Eisentraut)

    如有兼容需要,可使用服务器参数 bytea_output 选择传统输出格式。

  • 数组输入现在只把普通 ASCII 空白字符视为可能可忽略;它永远不会忽略非 ASCII 字符,即使按某些区域设置它们是空白(Tom Lane)

    这避免了一些数组值可能因服务器区域设置不同而被不同解释的极端情况。

  • 改进 SIMILAR TO 模式和 SQL 风格 substring() 模式的标准符合性(Tom Lane)

    这包括把 ?{...} 视为模式元字符(它们此前是普通字面字符);这对应 SQL:2008 新增的特性。此外,^$ 现在被视为普通字面字符;此前它们被视为元字符,就好像模式遵循 POSIX 而不是 SQL 规则。另外,在 SQL 标准 substring() 中,用括号嵌套不再干扰子串的捕获。另外,方括号表达式(字符类)的处理现在更符合标准。

  • 按 SQL 标准拒绝位串 3 参数 substring() 中的负长度值(Tom Lane)

  • date_trunc 在降低秒的小数部分精度时截断而不是舍入(Tom Lane)

    对于基于整数的日期/时间,代码一直如此。现在基于浮点的日期/时间行为类似。

E.24.2.4. 对象重命名

  • 当子表从多个不相关的父表继承同一列时,收紧 RENAME 期间列名一致性的强制(KaiGai Kohei)

  • 不再在底层表列被重命名时自动重命名索引和索引列(Tom Lane)

    管理员仍可以手工重命名这类索引和列。此变更需要更新 JDBC 驱动(可能还有其他驱动),以便重命名后仍能正确识别唯一索引。

  • CREATE OR REPLACE FUNCTION 不再能更改函数参数的声明名称(Pavel Stehule)

    为了避免在命名参数调用中产生歧义,不再允许更改现有函数声明中输入参数的别名(但仍可为此前未命名的参数指定名称)。现在必须 DROP 并重建函数才能做到这一点。

E.24.2.5. PL/pgSQL

  • 当变量名与查询中使用的列名冲突时,PL/pgSQL 现在抛出错误(Tom Lane)

    此前的行为是把有歧义的名称优先绑定到 PL/pgSQL 变量而不是查询列,这常常导致令人惊讶的错误行为。抛出错误可以轻松检测歧义情况。虽然建议修改遇到此类错误的函数以消除冲突,但如有必要,可以通过配置参数 plpgsql.variable_conflict 或逐函数选项 #variable_conflict 恢复旧行为。

  • PL/pgSQL 不再允许与某些 SQL 保留字匹配的变量名(Tom Lane)

    这是使 PL/pgSQL 解析器与核心 SQL 解析器更紧密对齐的结果。如有必要,可以为变量名加双引号来避开此限制。

  • PL/pgSQL 现在要求组合结果的列不仅匹配基本类型,还要匹配预期的类型修饰符(Pavel Stehule、Tom Lane)

    例如,如果结果类型的某列声明为 NUMERIC(30,2),则在该列中返回其他精度的 NUMERIC 不再被接受。以前的版本疏于检查类型修饰符,因此会允许实际上不符合声明限制的结果行。

  • PL/pgSQL 现在更一致地处理选择到组合字段的情况(Tom Lane)

    此前,像 SELECT ... INTO rec.fld FROM ... 这样的语句即使记录字段 fld 是组合类型,也被视为标量赋值。现在它被视为记录赋值,与 INTO 目标是组合类型的常规变量时相同。因此,要赋给字段各子字段的值应写成 SELECT 列表的单独列,而不是像以前版本那样写成 ROW(...) 构造。

    如果需要以同时适用于 9.0 和以前版本的方式做到这一点,可以写成类似 rec.fld := ROW(...) FROM ...

  • 移除 PL/pgSQL 的 RENAME 声明(Tom Lane)

    ALIAS 取代 RENAME,它现在可以为任何变量创建别名,而不再像以前那样只能用于美元符号参数名(如 $1)。

E.24.2.6. 其他不兼容之处

  • 废弃把 => 用作操作符名(Robert Haas)

    为了支持 SQL 标准的命名函数参数记法,未来版本的 PostgreSQL 可能会完全拒绝此操作符名。目前它仍被允许,但定义此类操作符时会发出警告。

  • 移除对没有可用 64 位整数数据类型的平台的支持(Tom Lane)

    据信所有仍受支持的平台都有可用的 64 位整数数据类型。

E.24.3. 变更

版本 9.0 拥有前所未有的数量的重大新特性,以及 200 多项增强、改进、新命令、新函数和其他变更。

E.24.3.1. 服务器

E.24.3.1.1. 连续归档和流复制

PostgreSQL 现有的备库服务器能力得到扩展,既支持在备库服务器上执行只读查询,又大幅减少主库与备库之间的延迟。对许多用户而言,这将成为一种有用且低管理成本的复制形式,无论用于高可用还是水平扩展。

  • 允许备库服务器接受只读查询(Simon Riggs、Heikki Linnakangas)

    此特性称为热备。有新的 postgresql.confrecovery.conf 设置控制此特性,并有详尽的文档

  • 允许把预写式日志(WAL)数据流式传输到备库服务器(Fujii Masao、Heikki Linnakangas)

    此特性称为流复制。此前 WAL 数据只能以整个 WAL 文件(通常每个 16 MB)为单位发送到备库服务器。流复制消除了这种低效,使主库上的更新能以极小延迟传播到备库服务器。有新的 postgresql.confrecovery.conf 设置控制此特性,并有详尽的文档

  • 新增 pg_last_xlog_receive_location()pg_last_xlog_replay_location(),可用于监控备库服务器的 WAL 活动(Simon Riggs、Fujii Masao、Heikki Linnakangas)

E.24.3.1.2. 性能
  • 允许通过 ALTER TABLESPACE ... SET/RESET 为顺序和随机页面代价估计(seq_page_cost/random_page_cost)设置逐表空间的值(Robert Haas)

  • 改进连接查询中 EvalPlanQual 重新检查的性能和可靠性(Tom Lane)

    涉及连接的 UPDATEDELETESELECT FOR UPDATE/SHARE 查询在遇到刚更新的行时现在表现得好得多。

  • 改进表在同一事务中较早前被创建或截断时 TRUNCATE 的性能(Tom Lane)

  • 改进查找继承子表的性能(Tom Lane)

E.24.3.1.3. 优化器
  • 移除不必要的外连接(Robert Haas)

    内侧唯一且未被连接以上引用的外连接是不必要的,因此现在会被移除。这将加速许多自动生成的查询,例如对象关系映射器(ORM)创建的查询。

  • 允许 IS NOT NULL 限制使用索引(Tom Lane)

    这在包含大量空值的索引中查找 MAX()/MIN() 值时特别有用。

  • 改进优化器关于何时使用物化节点、以及 DISTINCT 用排序还是哈希的选择(Tom Lane)

  • 改进优化器对涉及 boolean <> 操作符的表达式的等价检测(Tom Lane)

E.24.3.1.4. GEQO
  • 让 GEQO 每次规划查询时使用相同的随机种子(Andres Freund)

    虽然遗传查询优化器(GEQO)仍然随机选择计划,但它现在对相同查询总是选择相同的随机计划,从而给出更一致的性能。可以修改 geqo_seed 来试验其他计划。

  • 改进 GEQO 计划选择(Tom Lane)

    这避免了罕见的 failed to make a valid plan 错误,还应能改进规划速度。

E.24.3.1.5. 优化器统计
  • 改进 ANALYZE,使其支持继承树统计信息(Tom Lane)

    这对分区表特别有用。但自动清理尚不会在子表变化时自动重新分析父表。

  • 改进自动清理对何时需要重新分析的检测(Tom Lane)

  • 改进优化器对大于/小于比较的估计(Tom Lane)

    在查找大于/小于比较的统计信息时,如果比较值位于第一个或最后一个直方图桶中,则使用索引(如果可用)获取该列当前的実際最小值或最大值。这大幅改进了对数据范围端点附近比较值的估计准确性,尤其是当范围因新数据的添加而不断变化时。

  • 允许使用 ALTER TABLE 设置不同值数量统计信息(Robert Haas)

    这允许用户覆盖某列不同值的估计数量或百分比。此统计信息通常由 ANALYZE 计算,但估计可能不佳,尤其是在行数非常多的表上。

E.24.3.1.6. 认证
  • 新增对 RADIUS(远程认证拨入用户服务)认证的支持(Magnus Hagander)

  • 允许 LDAP(轻量目录访问协议)认证以搜索/绑定模式运行(Robert Fleming、Magnus Hagander)

    这允许先查找用户,然后系统使用为该用户返回的 DN(可分辨名称)。

  • pg_hba.conf 新增 samehostsamenet 指定(Stef Walter)

    它们分别匹配服务器的 IP 地址和子网地址。

  • 把受信任的 SSL 根证书名称传递给客户端,使客户端能返回合适的客户端证书(Craig Ringer)

E.24.3.1.7. 监控
  • 新增客户端设置应用名的能力,它显示在 pg_stat_activity 中(Dave Page)

    这允许管理员按源应用刻画数据库流量并排查问题。

  • log_line_prefix 新增 SQLSTATE 选项(%e)(Guillaume Smet)

    这允许用户按错误码编号汇总错误和消息的统计信息。

  • UTF16 编码写入 Windows 事件日志(Itagaki Takahiro)

    现在 Windows 上的 PostgreSQL 日志消息有了真正的多语言支持。

E.24.3.1.8. 统计计数器
E.24.3.1.9. 服务器设置
  • 允许基于数据库/角色组合设置配置参数(Alvaro Herrera)

    此前只能按数据库和按角色设置,不能组合。所有角色和数据库设置现在存储在新的 pg_db_role_setting 系统目录中。新的 psql 命令 \drds 显示这些设置。传统系统视图 pg_rolespg_shadowpg_user 不显示组合设置,因此不再完全表示用户或数据库的配置。

  • 新增服务器参数 bonjour,控制启用 Bonjour 的服务器是否通过 Bonjour 宣告自身(Tom Lane)

    默认为关闭,即不宣告。这使打包者可以分发启用 Bonjour 的构建,而不必担心个别用户不想要此特性。

  • 新增服务器参数 enable_material,控制优化器对物化节点的使用(Robert Haas)

    默认为开启。关闭时,优化器不会纯粹出于性能原因添加物化节点,但在正确性需要时仍会使用。

  • 更改服务器参数 log_temp_files,使其默认文件大小单位为千字节(Robert Haas)

    此前如果未指定单位,此设置按字节解释。

  • 在重新加载 postgresql.conf 时记录参数值的变更(Peter Eisentraut)

    这使管理员和安全人员可以审计数据库设置的变更,而且对检查 postgresql.conf 编辑的效果也非常方便。

  • 对自定义服务器参数正确强制超级用户权限(Tom Lane)

    非超级用户不再能对服务器当前未知的参数发出 ALTER ROLE/DATABASE SET。这使服务器能够正确检查仅超级用户参数只由超级用户设置。此前,SET 会被允许,然后在会话启动时被忽略,使仅超级用户自定义参数远不如应有的有用。

E.24.3.2. 查询

  • 在应用 LIMIT 之后执行 SELECT FOR UPDATE/SHARE 处理,使返回的行数总是可预测(Tom Lane)

    此前,并发事务所做的更改可能导致 SELECT FOR UPDATE 意外返回少于 LIMIT 指定的行数。FOR UPDATEORDER BY 组合仍可能产生令人惊讶的结果,但可以通过把 FOR UPDATE 放在子查询中来纠正。

  • 允许混用传统与 SQL 标准的 LIMIT/OFFSET 语法(Tom Lane)

  • 扩展窗口函数支持的帧选项(Hitoshi Harada)

    帧现在可以以 CURRENT ROW 开始,并且支持 ROWS n PRECEDING/FOLLOWING 选项。

  • SELECT INTOCREATE TABLE AS 在其命令标签中向客户端返回行数(Boszormenyi Zoltan)

    这可以省去一整次到客户端的往返,允许在不需要额外 COUNT 查询的情况下计算结果数和分页。

E.24.3.2.1. Unicode 字符串
  • U& 字符串和标识符中支持 Unicode 代理对(双 16 位表示)(Peter Eisentraut)

  • E'...' 字符串中支持 Unicode 转义(Marko Kreen)

E.24.3.3. 对象操作

  • 通过推迟刷盘加速 CREATE DATABASE(Andres Freund、Greg Stark)

  • 只允许对表、视图和组合类型的列加注释,不允许对索引和 TOAST 表等其他关系类型(Tom Lane)

  • 允许创建不含任何值的枚举类型(Bruce Momjian)

  • 让存储类型为 MAIN 的列值保留在主堆页上,除非行放不进一个页面(Kevin Grittner)

    此前 MAIN 值会被强制移出到 TOAST 表,直到行大小小于页面大小的四分之一。

E.24.3.3.1. ALTER TABLE
  • ALTER TABLE DROP COLUMNALTER TABLE DROP CONSTRAINT 实现 IF EXISTS(Andres Freund)

  • 允许重写表的 ALTER TABLE 命令跳过 WAL 日志记录(Itagaki Takahiro)

    这类操作要么产生表的新副本要么回滚,因此可以跳过 WAL 归档,除非运行在连续归档模式下。这减少了 I/O 开销并改进了性能。

  • 修复由非表所有者执行 ALTER TABLE table ADD COLUMN col serial 时的失败(Tom Lane)

E.24.3.3.2. CREATE TABLE
  • CREATE TABLE ... LIKE 命令新增复制 COMMENTSSTORAGE 设置的支持(Itagaki Takahiro)

  • CREATE TABLE ... LIKE 命令新增复制所有属性的快捷方式(Itagaki Takahiro)

  • 新增 SQL 标准的 CREATE TABLE ... OF type 命令(Peter Eisentraut)

    这允许创建匹配现有组合类型的表。命令中还可以指定额外的约束和默认值。

E.24.3.3.3. 约束
  • 新增可延迟唯一约束(Dean Rasheed)

    这使批量更新(例如 UPDATE tab SET col = col + 1)能够在有唯一索引或标记为主键的列上可靠工作。如果约束指定为 DEFERRABLE,它将在语句末尾而不是每行更新后检查。约束检查还可以推迟到当前事务末尾,使这类更新可以分散到多个 SQL 命令中。

  • 新增排他约束(Jeff Davis)

    排他约束通过允许任意比较操作符(而不仅仅是相等)来泛化唯一约束。它们通过 CREATE TABLE CONSTRAINT ... EXCLUDE 子句创建。排他约束最常见的用途是指定列项不得重叠,而不仅仅是不相等。这对时间段和其他范围以及数组都很有用。此特性增强了许多日历、时间管理和科学应用的数据完整性检查。

  • 改进唯一约束违规错误消息,报告导致失败的值(Itagaki Takahiro)

    例如,唯一约束违规现在可能报告 Key (x)=(2) already exists

E.24.3.3.4. 对象权限
  • 新增使用新的 GRANT/REVOKE IN SCHEMA 子句在整个模式内批量修改权限的能力(Petr Jelinek)

    这简化了对象权限的管理,并使为应用数据安全利用数据库角色更加容易。

  • 新增 ALTER DEFAULT PRIVILEGES 命令,用于控制稍后创建的对象的权限(Petr Jelinek)

    这大幅简化了复杂数据库应用中对象权限的分配。可以为表、视图、序列和函数设置默认权限。默认值可以按模式分配,也可以数据库范围分配。

  • 新增用 GRANT/REVOKE 控制大对象(BLOB)权限的能力(KaiGai Kohei)

    此前任何数据库用户都可以读取或修改任何大对象。现在可以逐大对象授予和撤销读写权限,并且会跟踪大对象的所有权。

E.24.3.4. 工具操作

  • LISTEN/NOTIFY 把未决事件存储在内存队列而不是系统表中(Joachim Wieland)

    这大幅改进了性能,同时保留了事务支持和保证送达的现有特性。

  • 允许 NOTIFY 向监听者传递可选的载荷字符串(Joachim Wieland)

    这大幅提升了 LISTEN/NOTIFY 作为通用事件队列系统的实用性。

  • 允许对所有逐数据库系统目录执行 CLUSTER(Tom Lane)

    共享目录仍然不能聚簇。

E.24.3.4.1. COPY
  • 接受 COPY ... CSV FORCE QUOTE *(Itagaki Takahiro)

    现在 * 可用作 FORCE QUOTE 子句中所有列的简写。

  • 新增允许在括号内指定选项的 COPY 语法(Robert Haas、Emmanuel Cecchet)

    这为未来的 COPY 选项提供了更大的灵活性。仍支持旧语法,但只用于既有选项。

E.24.3.4.2. EXPLAIN
  • 允许 EXPLAINXMLJSONYAML 格式输出(Robert Haas、Greg Sabino Mullane)

    新的输出格式易于机器读取,支持开发分析 EXPLAIN 输出的新工具。

  • 新增 BUFFERS 选项,用于在 EXPLAIN ANALYZE 期间报告查询缓冲区使用情况(Itagaki Takahiro)

    这允许对单个查询做更好的分析。缓冲区使用情况不再报告在 log_statement_stats 及相关设置的输出中。

  • EXPLAIN 输出中添加哈希使用信息(Robert Haas)

  • 新增允许在括号内指定选项的 EXPLAIN 语法(Robert Haas)

    这为未来的 EXPLAIN 选项提供了更大的灵活性。仍支持旧语法,但只用于既有选项。

E.24.3.4.3. VACUUM
  • 更改 VACUUM FULL,使其重写整个表并重建其索引,而不是移动单个行来压缩空间(Itagaki Takahiro、Tom Lane)

    以前的方法通常更慢并导致索引膨胀。注意新方法在 VACUUM FULL 期间会暂时使用更多磁盘空间;可能多达表及其索引通常占用空间的两倍。

  • 新增允许在括号内指定选项的 VACUUM 语法(Itagaki Takahiro)

    这为未来的 VACUUM 选项提供了更大的灵活性。仍支持旧语法,但只用于既有选项。

E.24.3.4.4. 索引
  • 允许在 CREATE INDEX 中省略索引名以自动命名索引(Tom Lane)

  • 默认情况下,多列索引现在以所有列命名;索引表达式列现在基于其表达式命名(Tom Lane)

  • 重建共享系统目录的索引现在完全是事务性且崩溃安全的(Tom Lane)

    此前,重建共享索引只允许在独立模式下进行,而且操作期间崩溃可能使索引处于比之前更糟的状态。

  • GiST 新增 point_ops 操作符类(Teodor Sigaev)

    此特性允许对 point 列建立 GiST 索引。该索引可用于多种类型的查询,例如 point <@ polygon(点在多边形内)。这应能使许多 PostGIS 查询更快。

  • GIN 索引创建中使用红黑二叉树(Teodor Sigaev)

    红黑树是自平衡的。这避免了输入以非随机顺序出现时的变慢。

E.24.3.5. 数据类型

  • 允许 bytea 值以十六进制记法书写(Peter Eisentraut)

    服务器参数 bytea_output 控制 bytea 输出使用十六进制还是传统格式。Libpq 的 PQescapeByteaConn() 函数在连接 PostgreSQL 9.0 或更新服务器时自动使用十六进制格式。但 9.0 之前的 libpq 版本无法正确处理来自更新服务器的十六进制格式。

    新的十六进制格式与更多使用二进制数据的应用直接兼容,使它们无需额外转换即可存储和获取。它的读写也明显快于传统格式。

  • 允许把服务器参数 extra_float_digits 增大到 3(Tom Lane)

    此前 extra_float_digits 的最大设置为 2。有些情况需要 3 位数字才能精确转储和恢复 float4 值。pg_dump 现在在从允许它的服务器转储时将使用设置 3。

  • 收紧对 int2vector 值的输入检查(Caleb Welton)

E.24.3.5.1. Full Text Search
  • synonym 词典中新增前缀支持(Teodor Sigaev)

  • 新增过滤词典(Teodor Sigaev)

    过滤词典允许先修改词元再传递给后续词典。

  • 允许电子邮件地址词元中包含下划线(Teodor Sigaev)

  • 使用更符合标准的规则解析 URL 词元(Tom Lane)

E.24.3.6. 函数

  • 允许函数调用提供参数名并与函数定义中的命名参数匹配(Pavel Stehule)

    例如,如果函数定义为接受参数 ab,则可以用 func(a := 7, b := 12)func(b := 12, a := 7) 调用它。

  • 支持在 UTF-8 服务器编码下进行区域特定的正则表达式处理(Tom Lane)

    区域特定的正则表达式功能包括不区分大小写的匹配和区域特定的字符类。此前,这些特性只有当数据库使用单字节服务器编码(如 LATIN1)时才能对非 ASCII 字符正确工作。在 UTF-8 之外的多字节编码中它们仍会行为不当。

  • to_char() 中新增科学计数法支持(EEEE 规范)(Pavel Stehule、Brendan Jurd)

  • to_char()YYYYYY 规范中遵循 FM(填充模式)(Bruce Momjian、Tom Lane)

    YYYY 此前已遵循它。

  • 修复 to_char(),使其在 Windows 上以正确的编码输出本地化的数字和货币字符串(Hiroshi Inoue、Itagaki Takahiro、Bruce Momjian)

  • 修正多边形的重叠包含运算的计算(Teodor Sigaev)

    多边形 &&(重叠)操作符此前只检查两个多边形的边界框是否重叠。现在它做更正确的检查。多边形 @><@(包含/被包含)操作符此前检查一个多边形的所有顶点是否都包含在另一个中;这对某些非凸多边形可能错误地报告。现在它们检查一个多边形的所有线段都包含在另一个中。

E.24.3.6.1. 聚合
  • 允许聚合函数使用 ORDER BY(Andrew Gierth)

    例如,现在支持:array_agg(a ORDER BY b)。这对输入值顺序很重要的聚合很有用,并消除了使用非标准子查询来确定排序的需要。

  • 多参数聚合函数现在可以使用 DISTINCT(Andrew Gierth)

  • 新增聚合函数 string_agg(),用于把值组合成单个字符串(Pavel Stehule)

  • 如果聚合转换函数未标记为 STRICT,以 DISTINCT 调用的聚合函数现在会被传递 NULL 值(Andrew Gierth)

    例如,agg(DISTINCT x) 可能会把 NULL 的 x 值传递给 agg()。这与非 DISTINCT 情况下的行为更一致。

E.24.3.6.2. 位串
  • bit 字符串新增 get_bit()set_bit() 函数,与 bytea 的对应函数保持一致(Leonardo F)

  • bit 字符串和 bytea 实现 OVERLAY()(替换)(Leonardo F)

E.24.3.6.3. 对象信息函数
  • 新增 pg_table_size()pg_indexes_size(),为 pg_relation_size() 函数提供更用户友好的接口(Bernd Helmle)

  • 新增用于序列权限检查的 has_sequence_privilege()(Abhijit Menon-Sen)

  • 更新 information_schema 视图以符合 SQL:2008(Peter Eisentraut)

  • information_schema 视图正确显示 charvarchar 列的最大八位字节长度(Peter Eisentraut)

  • 加速 information_schema 权限视图(Joachim Wieland)

E.24.3.6.4. 函数和触发器创建
  • 支持使用 DO 语句执行匿名代码块(Petr Jelinek、Joshua Tolley、Hannu Valtonen)

    这允许执行服务器端代码而无需创建和删除临时函数定义。可以用用户有权定义函数的任何语言执行代码。

  • 实现符合 SQL 标准的逐列触发器(Itagaki Takahiro)

    这类触发器只在指定列受查询影响(例如出现在 UPDATESET 列表中)时触发。

  • CREATE TRIGGER 新增 WHEN 子句,允许控制触发器是否触发(Itagaki Takahiro)

    虽然同类检查总是可以在触发器内部执行,但在外部 WHEN 子句中执行可能有性能收益。

E.24.3.7. 服务器端语言

  • CREATE LANGUAGE 新增 OR REPLACE 子句(Tom Lane)

    这有助于在语言尚不存在时选择性地安装它,而且在 PL/pgSQL 默认安装的现在特别有用。

E.24.3.7.1. PL/pgSQL Server-Side Language
  • 默认安装 PL/pgSQL(Bruce Momjian)

    如果管理员对其可用性有安全或性能方面的顾虑,仍可以把它从特定数据库中移除。

  • 改进对 PL/pgSQL 变量名与函数内查询所用标识符冲突情况的处理(Tom Lane)

    现在的默认行为是在存在冲突时抛出错误,以避免令人惊讶的行为。可以通过配置参数 plpgsql.variable_conflict 或逐函数选项 #variable_conflict 修改它,允许使用变量或查询提供的列。无论如何,PL/pgSQL 不再尝试在语法上无效的位置替换变量。

  • 让 PL/pgSQL 使用主词法分析器而不是自己的版本(Tom Lane)

    这确保了对主系统行为(如字符串转义等细节)的准确跟踪。一些用户可见的细节(例如 PL/pgSQL 中被视为保留的关键字集合)因此而改变。

  • 避免对无效的记录引用抛出不必要的错误(Tom Lane)

    现在只有当引用实际被获取时才抛出错误,而不是在到达外层表达式时就抛出。例如,许多人曾在触发器中尝试这样做:

     if TG_OP = 'INSERT' and NEW.col1 = ... then 
    

    这现在将按预期工作。

  • 改进 PL/pgSQL 处理带已删除列的行类型的能力(Pavel Stehule)

  • 允许在 PL/pgSQL 函数内为输入参数赋值(Steve Prentice)

    此前输入参数被视为声明为 CONST,因此函数代码不能更改它们的值。此限制已被移除,以简化从没有等效限制的其他 DBMS 移植函数。输入参数现在就像初始化为传入值的局部变量。

  • 改进 PL/pgSQL 的错误位置报告(Tom Lane)

  • 为 PL/pgSQL 的 MOVE FORWARD/BACKWARD 新增 countALL 选项(Pavel Stehule)

  • 允许 PL/pgSQL 的 WHERE CURRENT OF 使用游标变量(Tom Lane)

  • 允许 PL/pgSQL 的 OPEN cursor FOR EXECUTE 使用参数(Pavel Stehule、Itagaki Takahiro)

    这通过新的 USING 子句实现。

E.24.3.7.2. PL/Perl Server-Side Language
  • 新增 PL/Perl 函数:quote_literal()quote_nullable()quote_ident()encode_bytea()decode_bytea()looks_like_number()encode_array_literal()encode_array_constructor()(Tim Bunce)

  • 新增服务器参数 plperl.on_init,用于指定 PL/Perl 初始化函数(Tim Bunce)

    还提供 plperl.on_plperl_initplperl.on_plperlu_init,分别用于可信或不可信语言的特定初始化。

  • 支持 PL/Perl 中的 END 块(Tim Bunce)

    END 块目前不允许数据库访问。

  • 允许 PL/Perl 中使用 use strict(Tim Bunce)

    Perl strict 检查还可以通过新的服务器参数 plperl.use_strict 全局启用。

  • 允许 PL/Perl 中使用 require(Tim Bunce)

    它基本上是测试模块是否已加载,如果没有则生成错误。它不允许加载管理员未通过初始化参数预加载的模块。

  • 如果使用 Perl 5.10 或更高版本,允许 PL/Perl 中使用 use feature(Tim Bunce)

  • 验证 PL/Perl 返回值在服务器编码中有效(Andrew Dunstan)

E.24.3.7.3. PL/Python Server-Side Language
  • 在 PL/Python 中新增 Unicode 支持(Peter Eisentraut)

    字符串会根据需要自动与服务器编码相互转换。

  • 改进 PL/Python 的 bytea 支持(Caleb Welton)

    传入 PL/Python 的 bytea 值现在表示为二进制而不是 PostgreSQL 的 bytea 文本格式。包含空字节的 bytea 值现在也能从 PL/Python 正确输出。布尔、整数和浮点值的传递也得到了改进。

  • 支持在 PL/Python 中使用数组作为参数和返回值(Peter Eisentraut)

  • 改进 SQL 域到 Python 类型的映射(Peter Eisentraut)

  • 为 PL/Python 新增 Python 3 支持(Peter Eisentraut)

    新的服务器端语言名为 plpython3u。它不能与 Python 2 服务器端语言在同一会话中使用。

  • 改进 PL/Python 的错误位置和异常报告(Peter Eisentraut)

E.24.3.8. 客户端应用程序

  • vacuumdb 新增 --analyze-only 选项,只分析不清理(Bruce Momjian)

E.24.3.8.1. psql
  • 新增对 psql 变量值作为 SQL 字符串或标识符加引号/转义的支持(Pavel Stehule、Robert Haas)

    例如,:'var' 会产生加了引号并正确转义为字面字符串的 var 值,而 :"var" 会产生加了引号并转义为标识符的值。

  • psql 忽略其读取的脚本文件中前导的 UTF-8 编码 Unicode 字节顺序标记(Itagaki Takahiro)

    这在客户端编码为 UTF-8 时启用。它改进了与某些(主要在 Windows 上)坚持插入此类标记的编辑器的兼容性。

  • 修复 psql --file -,使其正确遵循 --single-transaction(Bruce Momjian)

  • 避免两个 psql 会话并发运行时 psql 的命令行历史相互覆盖(Tom Lane)

  • 改进 psql 的 Tab 补全支持(Itagaki Takahiro)

  • 只要启用了 \timing 就显示其输出,无论是否处于安静模式(Peter Eisentraut)

E.24.3.8.1.1. psql Display
  • 改进 psql 中换行列的显示(Roger Leigh)

    此行为现在是默认。以前的格式可以通过 \pset linestyle old-ascii 使用。

  • 允许 psql 通过 \pset linestyle unicode 使用精致的 Unicode 画线字符(Roger Leigh)

E.24.3.8.1.2. psql \d Commands
  • \d 显示继承自指定父表的子表(Damien Clochard)

    \d 只显示子表数量,而 \d+ 显示所有子表的名称。

  • \d index_name 中显示索引列的定义(Khee Chin)

    该定义对表达式索引很有用。

  • 只在 \d+ 而不是 \d 中显示视图的定义查询(Peter Eisentraut)

    始终包含查询被认为过于冗长。

E.24.3.8.2. pg_dump
  • pg_dump/pg_restore--clean 也移除大对象(Itagaki Takahiro)

  • 修复 pg_dump,使其在启用 standard_conforming_strings 时正确转储大对象(Tom Lane)

    以前的编码在转储到归档文件再由 pg_restore 生成脚本输出时可能失败。

  • pg_restore 现在在生成脚本输出时以十六进制格式发出大对象数据(Tom Lane)

    如果脚本随后被加载到 9.0 之前的服务器,这可能导致兼容性问题。解决办法是改为直接恢复到服务器。

  • 允许 pg_dump 转储附加在组合类型列上的注释(Taro Minowa (Higepon))

  • pg_dump --verbose 在文本输出模式下输出 pg_dump 和服务器版本(Jim Cox、Tom Lane)

    这些在自定义输出模式下早已提供。

  • pg_restore 现在会在开关和可选文件名之后还有命令行参数时抱怨(Tom Lane)

    此前它会静默忽略任何这类参数。

E.24.3.8.3. pg_ctl
  • 允许在系统重启期间安全地用 pg_ctl 启动 postmaster(Tom Lane)

    此前,pg_ctl 的父进程可能基于过期的 postmaster 锁文件被误识别为运行中的 postmaster,导致数据库瞬时启动失败。

  • 赋予 pg_ctl 初始化数据库的能力(通过调用 initdb)(Zdenek Kotala)

E.24.3.9. Development Tools

E.24.3.9.1. libpq
  • 新增 libpq 函数 PQconnectdbParams()PQconnectStartParams()(Guillaume Lelarge)

    这些函数类似于 PQconnectdb()PQconnectStart(),只是它们接受以空结尾的连接选项数组,而不是要求在单个字符串中提供所有选项。

  • 新增 libpq 函数 PQescapeLiteral()PQescapeIdentifier()(Robert Haas)

    这些函数返回适当加引号和转义的 SQL 字符串字面量和标识符。调用者不需要像 PQescapeStringConn() 那样预分配字符串结果。

  • 新增对每用户服务文件(.pg_service.conf)的支持,它在全站服务文件之前检查(Peter Eisentraut)

  • 如果找不到指定的 libpq 服务则正确报告错误(Peter Eisentraut)

  • 在 libpq 中新增 TCP keepalive 设置(Tollef Fog Heen、Fujii Masao、Robert Haas)

    TCP 连接的服务器端此前已支持 keepalive 设置。

  • 在提供替代方法的平台上,避免 libpq 中为阻塞和取消阻塞 SIGPIPE 而进行的额外系统调用(Jeremy Kerr)

  • .pgpass 提供的口令失败时,在错误消息中说明口令来源(Bruce Momjian)

  • 加载客户端证书文件中给出的所有 SSL 证书(Tom Lane)

    这改进了对间接签名 SSL 证书的支持。

E.24.3.9.2. ecpg
  • ecpg 新增 SQLDA(SQL 描述符区域)支持(Boszormenyi Zoltan)

  • ecpg 新增 DESCRIBE [ OUTPUT ] 语句(Boszormenyi Zoltan)

  • 新增返回当前事务状态的 ECPGtransactionStatus 函数(Bernd Helmle)

  • ecpg Informix 兼容模式中新增 string 数据类型(Boszormenyi Zoltan)

  • 允许 ecpg 无限制地使用 newold 变量名(Michael Meskes)

  • 允许 ecpgfree() 中使用变量名(Michael Meskes)

  • ecpg_dynamic_type() 对非 SQL3 数据类型返回零(Michael Meskes)

    此前它返回数据类型 OID 的负值。但这可能与有效的类型 OID 混淆。

  • 在已有 64 位 long 的平台上支持 long long 类型(Michael Meskes)

E.24.3.9.2.1. ecpg Cursors
  • ecpg 的本机模式中新增范围外游标支持(Boszormenyi Zoltan)

    这允许 DECLARE 使用 OPEN 被调用时不在作用域内的变量。此机制在 ecpg 的 Informix 兼容模式中早已存在。

  • 允许 ecpg 中的动态游标名(Boszormenyi Zoltan)

  • 允许 ecpgFETCHMOVE 中使用噪声词 FROMIN(Boszormenyi Zoltan)

E.24.3.10. 构建选项

  • 默认启用客户端线程安全(Bruce Momjian)

    线程安全选项可以用 configure --disable-thread-safety 禁用。

  • 新增对控制 Linux 内存不足终止器的支持(Alex Hunsaker、Tom Lane)

    既然 /proc/self/oom_adj 允许禁用 Linux 内存不足(OOM)终止器,建议对 postmaster 禁用 OOM 终止。之后可能希望对 postmaster 的子进程重新启用 OOM 终止。新的编译期选项 LINUX_OOM_ADJ 允许对子进程重新激活终止器。

E.24.3.10.1. Makefile
  • 新的 Makefile 目标 worldinstall-worldinstallcheck-world(Andrew Dunstan)

    它们类似于现有的 allinstallinstallcheck 目标,但它们还构建 HTML 文档、构建并测试 contrib,并测试服务器端语言和 ecpg

  • PGXS Makefile 新增数据和文档安装位置控制(Mark Cave-Ayland)

  • 新增 Makefile 规则,把 PostgreSQL 文档构建为单个 HTML 文件或单个纯文本文件(Peter Eisentraut、Bruce Momjian)

E.24.3.10.2. Windows
  • 支持在 64 位 Windows 上编译并以 64 位模式运行(Tsutomu Yamada、Magnus Hagander)

    这允许在 Windows 上使用大型共享内存。

  • 支持使用 Visual Studio 2008 构建服务器(Magnus Hagander)

E.24.3.11. 源代码

  • 以子目录树而非发行版压缩包内的 tar 归档文件的形式分发预构建文档(Peter Eisentraut)

    例如,预构建的 HTML 文档现在位于 doc/src/sgml/html/;手册页的打包方式类似。

  • 使服务器词法分析器可重入(Tom Lane)

    这是 PL/pgSQL 使用该词法分析器所需要的。

  • 改进内存分配的速度(Tom Lane、Greg Stark)

  • 用户定义的约束触发器现在在 pg_constraintpg_trigger 中都有条目(Tom Lane)

    由于此变更,pg_constraint.pgconstrname 现在是冗余的,已被移除。

  • 新增系统目录列 pg_constraint.conindidpg_trigger.tgconstrindid,以更好地记录约束强制执行中索引的使用(Tom Lane)

  • 允许使用单个操作系统信号向后台进程传达多个条件(Fujii Masao)

    这允许新增特性而不受平台特定的信号条件数量限制。

  • 改进源代码测试覆盖率,包括 contrib、PL/Python 和 PL/Perl(Peter Eisentraut、Andrew Dunstan)

  • 移除系统表引导时对平面文件的使用(Tom Lane、Alvaro Herrera)

    这改进了使用大量角色或数据库时的性能,并消除了一些可能的失败条件。

  • 自动为引导目录生成 pg_attribute 的初始内容(John Naylor)

    这大幅简化了对这些目录的更改。

  • INSERT/UPDATE/DELETE 操作的处理从 execMain.c 中拆分出来(Marko Tiikkaja)

    更新现在在单独的 ModifyTable 节点中执行。此变更是未来改进的必要基础设施。

  • 简化 psql SQL 帮助文本的翻译(Peter Eisentraut)

  • 缩短某些文件名的长度,使发行版压缩包中所有文件路径都少于 100 个字符(Tom Lane)

    某些解压程序对更长的文件路径有问题。

  • 新增 ERRCODE_INVALID_PASSWORD SQLSTATE 错误码(Bruce Momjian)

  • 经作者许可,移除少数剩余的个人源代码版权声明(Bruce Momjian)

    个人版权声明无关紧要,但社区偶尔不得不回答关于它们的问题。

  • 新增关于以非持久模式运行 PostgreSQL 以改进性能的文档(Bruce Momjian)

  • 重构 HTML 文档 Makefile 规则,使其依赖检查正确工作,避免不必要的重建(Peter Eisentraut)

  • 使用 DocBook XSL 样式表而非 Docbook2X 构建手册页(Peter Eisentraut)

    这改变了构建手册页所需的工具集。

  • 改进 PL/Perl 代码结构(Tim Bunce)

  • 改进 PL/Perl 的错误上下文报告(Alexey Klyukin)

E.24.3.11.1. 新构建要求

注意,从发行版压缩包构建时这些要求不适用,因为压缩包已包含这些程序用来构建的文件。

  • 要求 Autoconf 2.63 来构建 configure(Peter Eisentraut)

  • 要求 Flex 2.5.31 或更高版本以从 CVS 检出构建(Tom Lane)

  • 要求 Perl 5.8 或更高版本以从 CVS 检出构建(John Naylor、Andrew Dunstan)

E.24.3.11.2. 可移植性
  • Bonjour 使用更现代的 API(Tom Lane)

    Bonjour 支持现在要求 OS X 10.3 或更高版本。旧 API 已被 Apple 弃用。

  • 新增 SuperH 架构的自旋锁支持(Nobuhiro Iwamatsu)

  • 允许非 GCC 编译器在支持时使用内联函数(Kurt Harriman)

  • 移除对没有可用 64 位整数数据类型的平台的支持(Tom Lane)

  • 重构 LDFLAGS 的使用,使其在平台间更一致(Tom Lane)

    LDFLAGS 现在用于链接可执行文件和共享库,并且在链接可执行文件时附加 LDFLAGS_EX,链接共享库时附加 LDFLAGS_SL

E.24.3.11.3. 服务器编程
  • 使后端头文件可以安全地包含在 C++ 中(Kurt Harriman、Peter Eisentraut)

    这些变更移除了此前使 C++ 难以用于后端代码的关键字冲突。但是,在为后端函数使用 C++ 时仍有其他复杂之处。在适当的地方仍需要 extern "C" { },内存管理和错误处理仍是有问题的。

  • 新增 AggCheckCallContext(),用于检测 C 函数是否被作为聚合调用(Hitoshi Harada)

  • 更改 SearchSysCache() 及相关函数的调用约定,以避免硬编码缓存键的最大数量(Robert Haas)

    现有调用目前仍可工作,但如果不转换为新风格,预计会在 9.1 或更高版本中中断。

  • 要求对 fastgetattr()heap_getattr() 后端宏的调用提供非 NULL 的第四个参数(Robert Haas)

  • 自定义 typanalyze 函数不应再依赖 VacAttrStats.attr 来确定将要传递给它们的数据类型(Tom Lane)

    此变更是为了允许对存储类型与底层列数据类型不同的索引列收集统计信息。有新的字段告知实际被分析的数据类型。

E.24.3.11.4. 服务器钩子
  • 新增用于处理 ColumnRef 和 ParamRef 节点的解析器钩子(Tom Lane)

  • 新增 ProcessUtility 钩子,使可加载模块可以控制工具命令(Itagaki Takahiro)

E.24.3.11.5. 二进制升级支持
  • 新增 contrib/pg_upgrade 以支持就地升级(Bruce Momjian)

    这避免了升级到 PostgreSQL 新大版本时转储/重载数据库的要求,从而把停机时间降低了数量级。它支持从 PostgreSQL 8.3 和 8.4 升级到 9.0。

  • 新增在二进制升级期间保留关系 relfilenode 值的支持(Bruce Momjian)

  • 新增在二进制升级期间保留 pg_typepg_enum OID 的支持(Bruce Momjian)

  • 把表空间内的数据文件移到 PostgreSQL 版本特定的子目录中(Bruce Momjian)

    这简化了二进制升级。

E.24.3.12. 附加模块

  • contrib/pgbench 新增多线程选项(-j)(Itagaki Takahiro)

    这允许 pgbench 使用多个 CPU,降低 pgbench 本身成为测试瓶颈的风险。

  • contrib/pgbench 新增 \shell\setshell 元命令(Michael Paquier)

  • contrib/dict_xsyn 的新特性(Sergey Karpov)

    新选项为 matchorigmatchsynonymskeepsynonyms

  • 新增全文词典 contrib/unaccent(Teodor Sigaev)

    这个过滤词典移除字母上的重音符号,使跨多种语言的全文搜索容易得多。

  • contrib/dblink 新增 dblink_get_notify()(Marcus Kempe)

    这允许 dblink 中的异步通知。

  • 改进 contrib/dblink 对已删除列的处理(Tom Lane)

    这影响 dblink_build_sql_insert() 及相关函数。这些函数现在按逻辑而非物理列编号对列计数。

  • 大幅提高 contrib/hstore 的数据长度限制,并新增 B-tree 和哈希支持,使 hstore 列上可以进行 GROUP BYDISTINCT 操作(Andrew Gierth)

    还新增了函数和操作符。这些改进使 hstore 成为嵌入 PostgreSQL 的全功能键值存储。

  • 新增 contrib/passwordcheck,用于支持站点特定的口令强度策略(Laurenz Albe)

    应修改此模块的源代码以实现站点特定的口令策略。

  • 新增 contrib/pg_archivecleanup 工具(Simon Riggs)

    它设计用于 archive_cleanup_command 服务器参数,用于删除不再需要的归档文件。

  • contrib/auto_explain 输出中添加查询文本(Andrew Dunstan)

  • contrib/pg_stat_statements 新增缓冲区访问计数器(Itagaki Takahiro)

  • 更新 contrib/start-scripts/linux,使其使用 /proc/self/oom_adj 禁用 Linux 内存不足OOM)终止器(Alex Hunsaker、Tom Lane)

提交更正

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