E.23. 发布版本 12 #
发布日期:. 2019-10-03
E.23.1. 概述
PostgreSQL 12 的主要增强包括:
整体性能改进,包括:
优化 B-树索引的空间利用率和读写性能
增强分区性能,包括提高包含数千个分区的表的查询性能,提高 INSERT 和 COPY 的插入性能,以及支持在不阻塞查询的情况下执行
ALTER TABLE ATTACH PARTITION自动内联公共表表达式(CTEs),并允许覆盖此行为
可通过 CREATE STATISTICS 定义多列最常见值(MCV)统计信息,为测试多个分布不均匀列的查询提供更好的计划
管理功能增强,包括:
REINDEX CONCURRENTLY可以重建索引,同时不阻塞对其表的写入pg_checksums 可以在离线集群中启用或禁用页校验和(用于检测数据损坏)
为 CREATE INDEX、REINDEX、CLUSTER、VACUUM FULL 和 pg_checksums 提供进度报告统计信息
支持 SQL/JSON 路径语言
存储的生成列
非确定性 ICU 排序规则,支持不区分大小写和重音的分组与排序
新的认证特性,包括:
在使用 GSSAPI 认证时加密 TCP/IP 连接
使用 DNS SRV 记录发现 LDAP 服务器
多因素认证,在
pg_hba.conf中将clientcert=verify-full选项与其他认证方法结合使用
以下各节将更详细地说明上述项目。
E.23.2. 迁移到版本 12
对于希望从任何先前版本迁移数据的用户,需要使用 pg_dumpall 进行导出/恢复,或使用 pg_upgrade 或逻辑复制。有关迁移到新主版本的一般信息,请参见第 18.6 节。
版本 12 包含许多可能影响与先前版本兼容性的变更。请注意以下不兼容性:
移除 oid 列的特殊行为(Andres Freund,John Naylor)§
以前,可以在建表时使用
WITH OIDS指定一个通常不可见的oid列;此功能已被移除。仍可将列显式声明为oid类型。对于包含使用WITH OIDS创建的列的表,其相关操作需要作出调整。以前带有隐藏
oid列的系统目录,现在改为具有普通的oid列。因此,SELECT *现在会输出这些列,而以前只有显式选择时才会显示它们。移除数据类型
abstime、reltime和tinterval(Andres Freund)§这些类型已被
timestamp等 SQL 标准类型取代。移除
timetravel扩展(Andres Freund)§将
recovery.conf设置移入postgresql.conf(Masao Fujii,Simon Riggs,Abhijit Menon-Sen,Sergei Kornilov)§不再使用
recovery.conf,如果该文件存在,服务器将无法启动。现在通过 recovery.signal 和standby.signal文件切换到非主库模式。trigger_file设置已重命名为 promote_trigger_file。standby_mode设置已被移除。不再允许指定多个相互冲突的
recovery_target* 设置(Peter Eisentraut)§具体而言,recovery_target、recovery_target_lsn、recovery_target_name、recovery_target_time 和 recovery_target_xid 中只允许指定一个。以前可以指定这些参数中的多个不同参数,并采用最后一个。现在只能指定其中一个,但同一个参数可以重复指定,并采用最后一次指定的值。
使恢复默认推进到最新时间线(Peter Eisentraut)§
具体而言,recovery_target_timeline 现在默认为
latest,而以前默认为current。重构几何函数和操作符的代码(Emre Hasegeli)§ § §
这可能产生比以前版本更精确但略有不同的结果。特别是,涉及 NaN、下溢、溢出和除以零的情况现在得到比以前更一致的处理。
采用新算法输出
real和double precision值,以提高性能(Andrew Gierth)§ §以前,显示的浮点值默认舍入到 6 位(
real)或 15 位(double precision),并根据 extra_float_digits 的值进行调整。现在,只要extra_float_digits大于零(这也是现在的默认值),就只输出保留精确二进制值所需的最少位数。当extra_float_digits设置为零或更小时,行为与以前相同。此外,浮点指数的格式现在在各平台上一致:除非必须使用三位数字,否则使用两位。在以前的版本中,Windows 构建始终输出三位数字。
random()和setseed()现在在各平台上行为一致(Tom Lane)§ §使用特定种子值调用
setseed()后生成的random()值序列,现在可能与以前不同。不过,该序列也将是可重复的;以前由于服务器内部其他随机数用途的干扰,无法保证这一点。SQLrandom()函数现在具有每个会话独立的私有状态,以防止这种干扰。更改 SQL 风格的
substring(),使其具有符合标准的贪婪匹配行为(Tom Lane)§当模式可以以多种方式匹配时,起始子模式现在会匹配尽可能少的文本,而非尽可能多的文本。例如,
%#"aa*#"%这样的模式现在会从输入中选择第一组a,而非最后一组。不再对
xpath()或XMLTABLE结构的结果进行美化输出(Tom Lane)§在某些情况下,这些函数会在节点集值中插入额外的空白(换行和/或空格)。这并不合适,因为根据具体用途,这些空白可能具有语义意义。
将命令行工具 pg_verify_checksums 重命名为 pg_checksums(Michaël Paquier)§
在 pg_restore 中,要求指定
-f -才能将转储内容发送到标准输出(Euler Taveira)§以前,如果未指定目标位置,默认会这样做,但这种行为被认为不够友好。
在 psql 的
\pset format命令中禁止不唯一的缩写(Daniel Vérité)§ §例如,以前
\pset format a会选择aligned;现在它会失败,因为这也可能表示asciidoc。在新建的 B-树索引中,将索引条目的最大长度减少八字节,以改进对重复条目的处理(Peter Geoghegan)§
这意味着,对通过 pg_upgrade 从以前版本升级而来的索引执行 REINDEX 操作时,可能会失败。
如果没有提供参数列表且存在多个匹配对象,则使
DROP IF EXISTS FUNCTION/PROCEDURE/AGGREGATE/ROUTINE报错(David Rowley)§同时改进此类情况下的错误消息。
将
pg_statistic_ext目录拆分为两个目录,并添加相应的pg_stats_ext视图(Dean Rasheed,Tomas Vondra)§ §此更改支持向无特权用户隐藏可能敏感的统计数据。
移除过时的
pg_constraint.consrc列(Peter Eisentraut)§此列早已弃用,因为它不会随其他目录变更(如列重命名)而更新。从
pg_constraint获取检查约束表达式文本形式的推荐方法是pg_get_expr(conbin, conrelid)。pg_get_constraintdef()也是一种有用的替代方法。移除过时的
pg_attrdef.adsrc列(Peter Eisentraut)§此列早已弃用,因为它不会随其他目录变更(如列重命名)而更新。从
pg_attrdef获取默认值表达式文本形式的推荐方法是pg_get_expr(adbin, adrelid)。将 name 类型的表列标记为默认使用“C”排序规则(Tom Lane,Daniel Vérité)§ §
数据类型
name的比较操作符现在可以使用任何排序规则,而不再总是使用“C”排序规则。为保留查询以前的语义,现在将name类型的列显式标记为使用“C”排序规则。这一改动的副作用是,name列上的正则表达式操作符现在默认使用“C”排序规则,而非数据库的排序规则,来确定依赖区域设置的正则表达式模式(例如\w)的行为。如果希望name列上的正则表达式具有非 C 行为,请附加一个显式的COLLATE子句。(对于用户定义的name列,另一种方法是在建表时指定不同的排序规则;但这只是将向后不兼容性转移到了比较操作符上。)将
information_schema视图中的对象名列视为name类型,而非varchar类型(Tom Lane)§ § §按照 SQL 标准,
information_schema视图中的对象名列被声明为域类型sql_identifier。在 PostgreSQL 中,底层目录列实际为name类型。此更改使sql_identifier成为基于name的域,而非原来的varchar。这消除了比较和排序行为中的语义不一致,可显著提高对information_schema视图中的对象名列施加限制的查询性能。不过请注意,不等式限制,例如SELECT ... FROM information_schema.tables WHERE table_name < 'foo';
现在默认使用“C”区域设置的比较语义,而非像以前那样使用数据库的默认排序规则。对这些列进行排序也将遵循“C”排序规则。通过添加
COLLATE "default"子句,可以强制使用以前的行为(及其低效率)。移除禁用动态共享内存的功能(Kyotaro Horiguchi)§
具体而言,dynamic_shared_memory_type 不再能够设置为
none。更严格地解析 libpq 整数连接参数(Fabien Coelho)§
在以前的版本中,为连接参数
connect_timeout、keepalives、keepalives_count、keepalives_idle、keepalives_interval和port使用不正确的整数值,会导致 libpq 忽略这些值,或失败并给出不正确的错误消息。
E.23.3. 变更
以下是 PostgreSQL 12 与上一个主版本之间变更的详细说明。
E.23.3.1. 服务器
E.23.3.1.1. 分区
提高分区表上许多操作的性能(Amit Langote,David Rowley,Tom Lane,Álvaro Herrera)§ § § § §
对于拥有数千个子分区的表,只影响少量分区的操作现在能够高效处理。
提高向分区表执行
COPY的速度(David Rowley)§允许分区边界使用任意表达式(Kyotaro Horiguchi,Tom Lane,Amit Langote)§
此类表达式在创建分区表时求值。以前,只允许将简单常量用作分区边界。
允许
CREATE TABLE为分区表指定的表空间影响其子分区的表空间(David Rowley,Álvaro Herrera)§如果已经按所需顺序扫描分区,则避免排序(David Rowley)§
降低执行
ALTER TABLE ATTACH PARTITION的锁定要求(Robert Haas)§添加分区自省函数(Michaël Paquier,Álvaro Herrera,Amit Langote)§ § §
新函数
pg_partition_root()返回分区树的最顶层父表,pg_partition_ancestors()报告分区的所有祖先,pg_partition_tree()显示分区信息。在系统视图
pg_indexes中包含分区索引(Suraj Kharage)§添加 psql 命令
\dP,用于列出分区表和索引(Pavel Stehule)§改进 psql 的
\d和\z对分区表的显示(Pavel Stehule,Michaël Paquier,Álvaro Herrera)§ § §修复可能导致
ALTER TABLE DETACH PARTITION留下不正确依赖状态的缺陷;这可能使后续操作行为异常,例如在删除表时未删除曾属于分区的子索引(Tom Lane)§
E.23.3.1.2. 索引
提高具有大量重复值的 B-树索引的性能和空间利用率(Peter Geoghegan,Heikki Linnakangas)§ § §
以前,重复索引条目在其重复值组内无序存储。这会增加索引插入的开销,因过多的页面分裂浪费空间,并降低
VACUUM回收整个页面的能力。现在,重复索引条目按堆存储顺序排序。通过 pg_upgrade 从以前版本升级而来的索引无法获得这些好处。
允许多列 B-树索引占用更少空间(Peter Geoghegan,Heikki Linnakangas)
内部页面和叶子页面的最小/最大值指示项现在只存储到发生差异的键为止的索引键,而非全部索引键。这也提高了索引访问的局部性。
通过 pg_upgrade 从以前版本升级而来的索引无法获得这些好处。
通过减少锁定开销提高 B-树索引插入速度(Alexander Korotkov)§
添加对 SP-GiST 索引的最近邻(KNN)搜索的支持(Nikita Glukhov,Alexander Korotkov,Vlad Sterzhanov)§
减少创建 GiST、GIN 和 SP-GiST 索引时的 WAL 写入开销(Anastasia Lubennikova,Andrey V. Lepikhov)§
提高多列索引上仅索引扫描的效率(Konstantin Knizhnik)§
提高 GiST 索引清理扫描的性能(Andrey Borodin,Konstantin Kuznetsov,Heikki Linnakangas)§
在 GiST
VACUUM期间删除空的叶子页面(Andrey Borodin)§降低索引重命名的锁定要求(Peter Eisentraut)§
E.23.3.1.3. 优化器
允许 CREATE STATISTICS 创建多列最常见值统计信息(Tomas Vondra)§ §
这改进了对多个列进行测试、需要估算多个
WHERE子句综合效果的查询的优化。如果这些列彼此相关且分布不均匀,多列统计信息将使估算显著改善。允许将公共表表达式(CTEs)内联到外层查询中(Andreas Karlsson,Andrew Gierth,David Fetter,Tom Lane)§ §
具体而言,如果 CTE 没有副作用、不是递归的,且在查询中只被引用一次,就会被自动内联。可以指定
MATERIALIZED来阻止内联,也可以指定NOT MATERIALIZED,强制内联被多次引用的 CTE。以前,CTE 从不被内联,总是在查询其余部分之前求值。允许控制何时为预备语句使用通用计划(Pavel Stehule)§
这由服务器参数 plan_cache_mode 控制。
改进只有一个子项的分区查询和
UNION ALL查询的优化(David Rowley)§仅用作类型别名的域不再给优化带来困难。
提高优化器验证带有
IS NOT NULL条件的部分索引可用于查询的能力(Tom Lane,James Coleman)§ §当调用查询包含类型转换或大型
子句时,现在可以在更多情况下识别索引的可用性。xIN (array)使用为每列定义的排序规则计算
ANALYZE统计信息(Tom Lane)§以前,所有统计信息都使用数据库的默认排序规则。对于使用非默认排序规则的列,这可能改善优化器行为。
改进对
tid类型列进行连接时的优化(Tom Lane)§ §这些更改主要提高了对
ctid列进行自连接的效率。修复某些 B-树比较操作符和支持函数的防泄漏属性标记(Tom Lane)§ §
这使一些以前在存在安全屏障视图或行级安全时无法应用的优化得以应用。
E.23.3.1.4. 一般性能
如果服务器构建时包含相应支持,则默认启用即时(JIT)编译(Andres Freund)§
请注意,默认构建不包含此支持,必须在配置构建时显式选择。
提高
position()及相关函数中多字节字符的搜索性能(Heikki Linnakangas)§允许对经过 TOAST 处理的值仅解压所需的最小部分(Paul Ramsey)§
这对只需检查经过 TOAST 处理的字段起始部分的例程很有用。
允许
ALTER TABLE ... SET NOT NULL避免不必要的表扫描(Sergei Kornilov)§当可以识别出表的列约束不允许空值时,就能进行此项优化。
会话时区为 UTC 时,允许使用
ALTER TABLE ... SET DATA TYPE在timestamp和timestamptz之间转换,而无需重写表(Noah Misch)§在 UTC 时区中,这两种数据类型是二进制兼容的。
提高将字符串转换为
int2或int4整数的速度(Andres Freund)§允许在
SERIALIZABLE隔离模式下使用并行查询(Thomas Munro)§以前,在此模式下会禁用并行执行。
使用
pread()和pwrite()执行随机 I/O(Oskari Saarenmaa,Thomas Munro)§ §这减少了 I/O 所需的系统调用次数。
E.23.3.1.5. 监控
允许仅记录一定比例事务中的语句(Adrien Nayrat)§
这由参数 log_transaction_sample_rate 控制。
为
CREATE INDEX和REINDEX操作添加进度报告(Álvaro Herrera,Peter Eisentraut)§ §进度通过
pg_stat_progress_create_index系统视图报告。为
CLUSTER和VACUUM FULL添加进度报告(Tatsuro Yamada)§进度通过
pg_stat_progress_cluster系统视图报告。为 pg_checksums 添加进度报告(Michael Banck,Bernd Helmle)§
可通过
--progress选项启用此功能。在
pg_stat_database中添加校验和失败计数器(Magnus Hagander)§在系统视图
pg_stat_database中添加对全局对象的跟踪(Julien Rouhaud)§全局对象对应的
pg_stat_database.datid值显示为零。添加列出归档目录内容的功能(Christoph Moench-Tegeder)§
相应函数为
pg_ls_archive_statusdir()。添加列出临时目录内容的功能(Nathan Bossart)§
相应函数
pg_ls_tmpdir()允许选择性地指定表空间。在系统视图
pg_stat_ssl中添加客户端证书信息(Peter Eisentraut)§新增列为
client_serial和issuer_dn。为使含义更清楚,将clientdn列重命名为client_dn。限制无特权用户在
pg_stat_ssl中可见的行(Peter Eisentraut)§服务器启动时输出包含服务器版本号的日志消息(Christoph Berg)§
如果新连接立即被关闭,则避免记录“incomplete startup packet”(Tom Lane)§
这避免了某些监控方式产生大量无用日志。
如果设置了 application_name,则在 log_connections 日志消息中包含它(Don Seiler)§
如果设置了集群名称,则让 WAL 接收进程将其应用名称设置为该集群名称(Peter Eisentraut)§
在
pg_stat_replication中添加最后收到的备库消息的时间戳(Lim Myungkyu)§
E.23.3.1.6. Authentication
添加 GSSAPI 加密支持(Robbie Harwood,Stephen Frost)§
此特性允许在使用 GSSAPI 认证时加密 TCP/IP 连接,无需另外配置 SSL 等加密设施。为支持此功能,在
pg_hba.conf中增加了hostgssenc和hostnogssenc记录类型,用于选择使用或不使用 GSSAPI 加密的连接,分别对应现有的hostssl和hostnossl记录类型。另外,还增加了 libpq 选项 gssencmode 和系统视图 pg_stat_gssapi。允许
pg_hba.conf的clientcert选项检查数据库用户名是否与客户端证书的通用名匹配(Julian Markwort,Marius Timmer)§此项新检查通过
clientcert=verify-full启用。允许使用 DNS SRV 记录发现 LDAP 服务器(Thomas Munro)§
这使指定
ldapserver不再是必需的。仅当 PostgreSQL 使用 OpenLDAP 编译时才支持此功能。
E.23.3.1.7. 服务器配置
添加使用 pg_checksums 启用/禁用集群校验和的功能(Michael Banck,Michaël Paquier)§
执行这些操作时必须关闭集群。
将 autovacuum_vacuum_cost_delay 的默认值降低到 2ms(Tom Lane)§
这使自动清理操作默认能够更快地执行。
允许 vacuum_cost_delay 接受小数值,以指定亚毫秒级延迟(Tom Lane)§
允许整数服务器参数接受小数输入(Tom Lane)§
例如,虽然
work_mem是整数参数,现在也允许执行SET work_mem = '30.1GB'。完成所有必要的单位转换后,该值会被舍入为整数。允许为浮点服务器参数定义单位(Tom Lane)§
添加服务器参数 wal_recycle 和 wal_init_zero,以控制 WAL 文件的循环利用(Jerry Jelinek)§
在 ZFS 等写时复制文件系统上,避免文件循环利用可能有益。
添加服务器参数 tcp_user_timeout,以控制服务器的 TCP 超时(Ryohei Nagaura)§
允许控制最低和最高 SSL 协议版本(Peter Eisentraut)§
相应服务器参数为 ssl_min_protocol_version 和 ssl_max_protocol_version。
添加服务器参数 ssl_library,以报告服务器使用的 SSL 库版本(Peter Eisentraut)§
添加服务器参数 shared_memory_type,以控制所使用的共享内存类型(Andres Freund)§
这允许在需要时选择 System V 共享内存。
E.23.3.2. 流复制和恢复
允许通过重新加载配置更改部分恢复参数(Peter Eisentraut)§
这些参数是 archive_cleanup_command、promote_trigger_file、recovery_end_command 和 recovery_min_apply_delay。
允许按连接设置流复制超时(wal_sender_timeout)(Takayuki Tsunakawa)§
以前,只能在整个集群范围内设置此参数。
添加函数
pg_promote(),用于将备库提升为主库(Laurenz Albe,Michaël Paquier)§ §以前,只能使用 pg_ctl 或创建触发文件来执行此操作。
允许复制复制槽(Masahiko Sawada)§
相应函数为
pg_copy_physical_replication_slot()和pg_copy_logical_replication_slot()。不再将 max_wal_senders 计入 max_connections(Alexander Kukushkin)§
为 recovery_target_timeline 添加显式值
current(Peter Eisentraut)§如果两阶段事务状态文件损坏,则使恢复失败(Michaël Paquier)§
以前,会记录一条警告并继续恢复,可能导致该事务丢失。
E.23.3.3. 工具命令
为 REINDEX 添加
CONCURRENTLY选项,以允许在不阻塞写入的情况下重建索引(Michaël Paquier,Andreas Karlsson,Peter Eisentraut)§这也可以通过 reindexdb 应用的
--concurrently选项控制。生成列的内容由表达式计算得出(可以引用同一表中的其他列),而非由
INSERT或UPDATE命令指定。为
COPY FROM添加WHERE子句,以控制接受哪些行(Surafel Temesgen)§这提供了过滤传入数据的简单方法。
允许更灵活地添加枚举值(Andrew Dunstan,Tom Lane,Thomas Munro)§
以前,不能在事务块中调用
ALTER TYPE ... ADD VALUE,除非它与创建该枚举类型的操作处于同一事务。现在可以在后续事务中调用,只要在提交之后才引用新的枚举值即可。添加结束当前事务并开始新事务的命令(Peter Eisentraut)§
这些命令为
COMMIT AND CHAIN和ROLLBACK AND CHAIN。为 VACUUM 和
CREATE TABLE添加选项,以阻止VACUUM截断尾部空页面(Takayuki Tsunakawa)§ §这些选项是
vacuum_truncate和toast.vacuum_truncate。使用这些选项可降低VACUUM的锁定要求,但会使其无法将磁盘空间归还给操作系统。允许
VACUUM跳过索引清理(Masahiko Sawada)§ §此更改添加了
VACUUM命令选项INDEX_CLEANUP,以及表存储选项vacuum_index_cleanup。使用此选项会降低空间回收能力,并可能导致索引膨胀,但在主要目标是冻结旧元组时很有帮助。添加跳过无法立即锁定的表上的
VACUUM和ANALYZE操作的功能(Nathan Bossart)§此选项名为
SKIP_LOCKED。允许为
VACUUM和ANALYZE的选项指定可选的布尔参数(Masahiko Sawada)§防止 TRUNCATE、
VACUUM和ANALYZE对用户没有权限的表请求锁(Michaël Paquier)§ §这可防止未经授权的锁定干扰用户查询。
为 EXPLAIN 添加
SETTINGS选项,以输出非默认的优化器设置(Tomas Vondra)§使用 auto_explain 时,也可通过设置
auto_explain.log_settings获取这些输出。为 CREATE AGGREGATE 添加
OR REPLACE选项(Andrew Gierth)§允许使用 ALTER TABLE 修改系统目录的选项(Peter Eisentraut)§
现在支持修改目录的
reloptions和自动清理设置。(仍然需要设置 allow_system_table_mods。)为外键选择默认约束名时,使用所有键列的名称(Peter Eisentraut)§
以前,约束名中只包含第一个列名,导致多列外键存在歧义。
E.23.3.4. 数据类型
更新各项 Unicode 相关信息,使其与 Unicode 12.1.0 一致(Peter Eisentraut)§ §
例如,这修复了 psql 对包含组合字符的输出进行错误排版的情况。
更新 Snowball 词干提取词典,支持新的语言(Arthur Zakirov)§
这为全文检索添加了阿拉伯语、印度尼西亚语、爱尔兰语、立陶宛语、尼泊尔语和泰米尔语的词干提取支持。
允许创建将按位不同的字符串判定为相等的排序规则(Peter Eisentraut)§
此功能支持“非确定性”排序规则,可以定义不区分大小写和重音的相等比较。因此,例如在文本列上创建不区分大小写的唯一约束,会比以前更容易。只有 ICU 排序规则支持此功能。
添加对旧版 ICU 中 ICU 排序规则属性的支持(Peter Eisentraut)§
这使所有 ICU 版本都能以一致的方式自定义排序规则。
允许 name 数据类型与其他文本类型更顺畅地比较(Tom Lane)§
name类型现在的行为很像基于text类型、默认排序规则为“C”的域。这使跨类型比较能够得到更高效的处理。
E.23.3.5. 函数
添加对 SQL/JSON 路径语言的支持(Nikita Glukhov,Teodor Sigaev,Alexander Korotkov,Oleg Bartunov,Liudmila Mantrova)§ § §
这允许使用符合 SQL 标准的语言对
JSON值执行复杂查询。同时为符合标准,添加
log10()作为log()的别名。采用更精确的算法,提高
variance()等统计聚合的精度(Dean Rasheed)§允许
date_trunc()接受额外参数来控制时区(Vik Fearing,Tom Lane)§这比使用
AT TIME ZONE子句更快、更简单。调整
to_timestamp()/to_date()函数,使其对模板不匹配更加宽容(Artur Zakirov,Alexander Korotkov,Liudmila Mantrova)§这种新行为更接近 Oracle 的同名函数。
修复 XML 函数中的各类缺陷(Pavel Stehule,Markus Winand,Chapman Flack)§
具体而言,修复
XMLTABLE、xpath()和xmlexists()中某些节点没有输出、抛出意外错误,或遗漏 XML 特殊字符必要转义的情况。允许在
XMLEXISTS和XMLTABLE中使用BY VALUE子句(Chapman Flack)§这个 SQL 标准子句在 PostgreSQL 的实现中没有作用,但以前被不必要地拒绝。
防止并行工作进程运行
current_schema()和current_schemas(),因为它们并非并行安全(Michaël Paquier)§对于声明返回
RECORD的表函数,允许在查询的列定义列表中使用RECORD和RECORD[]作为列类型(Elvis Pranskevichus)§
E.23.3.6. PL/pgSQL
E.23.3.7. 客户端接口
添加连接参数 tcp_user_timeout,以控制 libpq 的 TCP 超时(Ryohei Nagaura)§
允许 libpq(以及 psql)在错误消息中仅报告
SQLSTATE值(Didier Gautheron)§添加 libpq 函数
PQresultMemorySize(),以报告查询结果使用的内存(Lars Kanis,Tom Lane)§移除 libpq 的
options连接参数上的不显示/调试标志(Peter Eisentraut)§这允许 postgres_fdw 设置该参数。
允许 ecpg 创建
bytea数据类型的变量(Ryo Matsumura)§这允许 ECPG 客户端直接处理
bytea数据,而无需使用编码形式。为 ECPG 添加
PREPARE AS支持(Ryo Matsumura)§
E.23.3.8. 客户端应用程序
允许 vacuumdb 根据表的回卷视界选择需要清理的表(Nathan Bossart)§
相应选项为
--min-xid-age和--min-mxid-age。允许 vacuumdb 禁用锁等待或禁用对全可见页面的跳过(Nathan Bossart)§
相应选项为
--skip-locked和--disable-page-skipping。为命令行工具的输出添加着色(Peter Eisentraut)§
将环境变量
PG_COLOR设置为always或auto即可启用此功能。可以设置环境变量PG_COLORS,使用 ANSI 颜色转义码调整具体颜色。例如,默认行为等同于PG_COLORS="error=01;31:warning=01;35:locus=01"。
E.23.3.8.1. psql
在 psql 中添加 CSV 表格输出模式(Daniel Vérité)§
这通过
\pset format csv或命令行选项--csv控制。在 psql 针对 SQL 命令的
\help输出中显示手册页面的 URL(Peter Eisentraut)§改进
CREATE TABLE、CREATE TRIGGER、CREATE EVENT TRIGGER、ANALYZE、EXPLAIN、VACUUM、ALTER TABLE、ALTER INDEX、ALTER DATABASE和ALTER INDEX ALTER COLUMN的 Tab 补全(Dagfinn Ilmari Mannsåker,Tatsuro Yamada,Michaël Paquier,Tom Lane,Justin Pryzby)§ § § § § § § § §
E.23.3.9. 服务器应用程序
允许通过 pg_ctl 控制日志文件轮转(Kyotaro Horiguchi,Alexander Kuzmenkov,Alexander Korotkov)§
以前,只能通过 SQL 函数或进程信号来完成此操作。
在
pg_ctl start期间正确分离新服务器进程(Paul Guo)§这可防止调用 pg_ctl 的 shell 脚本后来被中断时,服务器随之关闭。
如果文件系统具有克隆功能,则允许 pg_upgrade 使用它(Peter Eisentraut)§
--clone选项具有--link的优点,同时可以防止新集群启动后旧集群被改动。允许指定 pg_upgrade 使用的套接字目录(Daniel Gustafsson)§
这通过
--socketdir控制,默认为当前目录。允许 pg_checksums 禁用 fsync 操作(Michaël Paquier)§
这通过
--no-sync选项控制。修复 pg_test_fsync,使其在 Windows 上报告准确的
open_datasync耗时(Laurenz Albe)§ §
E.23.3.9.1. pg_dump, pg_dumpall, pg_restore
当 pg_dump 通过
INSERT命令而非COPY输出数据时,允许每条INSERT包含多行数据(Surafel Temesgen,David Rowley)§ §控制此行为的选项为
--rows-per-insert。允许 pg_dump 输出
INSERT ... ON CONFLICT DO NOTHING(Surafel Temesgen)§这可避免恢复期间因冲突而失败。相应选项为
--on-conflict-do-nothing。将并行 pg_dump 的操作顺序与后续并行 pg_restore 使用的顺序解耦(Tom Lane)§
这使 pg_restore 能够以更充分的并行度执行恢复,尤其是在原始转储未并行执行的情况下。并行 pg_dump 的调度也有所改进。
允许为 pg_dump 和 pg_dumpall 指定 extra_float_digits 设置(Andrew Dunstan)§
这主要用于生成能够在不同源服务器版本之间精确比较的转储。不建议在常规使用中这样做,因为恢复转储时可能丢失精度。
为 pg_dumpall 添加
--exclude-database选项(Andrew Dunstan)§
E.23.3.10. 源代码
添加 CREATE ACCESS METHOD 命令,用于创建新的表类型(Andres Freund,Haribabu Kommi,Álvaro Herrera,Alexander Korotkov,Dmitry Dolgov)§ § § § § § § § §
这使开发新的表访问方法成为可能,从而为不同使用场景优化存储。现有的
heap访问方法仍是默认选项。添加规划器支持函数接口,以改进优化器对函数的估算、内联和索引使用(Tom Lane)§ § §
这允许扩展创建规划器支持函数,提供针对特定函数的选择率、代价和行数估算,这些估算可以依赖函数参数。支持函数还可以提供简化的表示和索引条件,大幅扩展优化的可能性。
简化手动分配的 OID 的重新编号,并为此类 OID 的管理制定新的项目政策(John Naylor,Tom Lane)§ §
为新的内置对象(如新函数)手动分配 OID 的补丁,现在应在 8000—9999 范围内随机选择 OID。在开发周期结束时,已提交补丁使用的 OID 将通过新的
renumber_oids.pl脚本重新编号为较小的数字,目前大约位于 4xxx范围内。这种做法应能大幅降低不同开发中补丁之间发生 OID 冲突的概率。虽然没有专门为外部使用预留 OID 的政策,但建议分支项目及其他需要私有手动分配 OID 的项目,使用 7
xxx范围高端的编号。这将避免与最近合入的补丁冲突,而且核心项目应该要很久才会用到该范围。使用动态库而非静态库构建 Cygwin 二进制文件(Marco Atzeri)§
移除 configure 开关
--disable-strong-random(Michaël Paquier)§现在必须有强随机数源。
在 Postgres 代码中,
printf系列函数以及strerror和strerror_r现在在各平台上行为一致(Tom Lane)§ § § §特别是,
printf在所有平台上都能理解%m;在 Windows 上,strerror能够处理 Winsock 错误码(以前仅在后端代码中支持,前端代码不支持);strerror_r则始终遵循 GNU 的返回约定。要求符合 C99 的编译器,并在 Windows 上要求 MSVC 2013 或更高版本(Andres Freund)§
使用 pandoc 代替 lynx 生成纯文本文档输出文件(Peter Eisentraut)§ §
这仅影响
make dist期间生成的INSTALL文件,以及很少使用的纯文本输出文件postgres.txt。Pandoc 的输出优于 lynx,并能避免某些区域设置/编码问题。需要 Pandoc 1.13 或更高版本。支持在 PostgreSQL 文档中使用图像(Jürgen Purtz)§
E.23.3.11. 附加模块
允许在更多情况下将
ORDER BY排序和LIMIT子句下推到 postgres_fdw 外部服务器(Etsuro Fujita)§ §正确遵循引用 postgres_fdw 表的视图上的
WITH CHECK OPTION(Etsuro Fujita)§虽然 postgres_fdw 表上的
CHECK OPTION会被忽略(因为引用的是外部表),但此类表上的视图被视为本地视图,因此此更改会对它们实施CHECK OPTION。以前,只有带有RETURNING子句且返回了CHECK OPTION值的INSERT和UPDATE才会得到验证。允许
pg_stat_statements_reset()提供更细的控制粒度(Haribabu Kommi,Amit Kapila)§此函数现在允许重置特定数据库、用户和查询的统计信息。
允许控制 auto_explain 的日志级别(Tom Dunstan,Andrew Dunstan)§
默认值为
LOG。允许 unaccent 处理某些以组合字符编码的重音(Hugh Ranalli)§
允许 unaccent 移除希腊字符的重音(Tasos Maschalidis)§
为 amcheck 的
bt_index_parent_check()函数添加参数,以从树根开始检查每个索引元组(Peter Geoghegan)§
E.23.4. 致谢 #
以下人员(按字母顺序排列)作为补丁作者、提交者、审查者、测试者或问题报告者为本版本做出了贡献。
| Abhijit Menon-Sen |
| Achilleas Mantzios |
| Adam Berlin |
| Adam Bielanski |
| Aditya Toshniwal |
| Adrien Nayrat |
| Alan Jackson |
| Albert Schabhuetl |
| Aleksander Alekseev |
| Alex Aktsipetrov |
| Alex Kliukin |
| Alex Macy |
| Alexander Korotkov |
| Alexander Kukushkin |
| Alexander Kuzmenkov |
| Alexander Lakhin |
| Alexandra Ryzhevich |
| Alexey Bashtanov |
| Alexey Ermakov |
| Alexey Kondratov |
| Alexey Kryuchkov |
| Alexey Stepanov |
| Allison Kaptur |
| Álvaro Herrera |
| Alyssa Ross |
| Amit Kapila |
| Amit Khandekar |
| Amit Langote |
| Amul Sul |
| Anastasia Lubennikova |
| André Hänsel |
| Andrea Gelmini |
| Andreas Joseph Krogh |
| Andreas Karlsson |
| Andreas Kunert |
| Andreas Scherbaum |
| Andreas Seltenreich |
| Andrei Yahorau |
| Andres Freund |
| Andrew Dunstan |
| Andrew Fletcher |
| Andrew Gierth |
| Andrew Krasichkov |
| Andrey Borodin |
| Andrey Klychkov |
| Andrey Lepikhov |
| Andy Abelisto |
| Anthony Greene |
| Anthony Skorski |
| Antonin Houska |
| Arne Roland |
| Arseny Sher |
| Arthur Zakirov |
| Ash Marath |
| Ashutosh Bapat |
| Ashutosh Sharma |
| Ashwin Agrawal |
| Aya Iwata |
| Bartosz Polnik |
| Basil Bourque |
| Bernd Helmle |
| Brad DeJong |
| Brigitte Blanc-Lafay |
| Bruce Klein |
| Bruce Momjian |
| Bruno Wolff |
| Chapman Flack |
| Chen Huajun |
| Chris Travers |
| Chris Wilson |
| Christian Hofstaedtler |
| Christoph Berg |
| Christoph Moench-Tegeder |
| Clemens Ladisch |
| Colm McHugh |
| Corey Huinker |
| Craig Ringer |
| Dagfinn Ilmari Mannsåker |
| Daisuke Higuchi |
| Daniel Fiori |
| Daniel Gustafsson |
| Daniel Vérité |
| Daniel Westermann |
| Daniel Wilches |
| Darafei Praliaskouski |
| Daryl Waycott |
| Dave Cramer |
| David Binderman |
| David Fetter |
| David G. Johnston |
| David Rowley |
| David Steele |
| Davy Machado |
| Dean Rasheed |
| Derek Hans |
| Derek Nelson |
| Devrim Gündüz |
| Dian Fay |
| Didier Gautheron |
| Dilip Kumar |
| Dmitry Dolgov |
| Dmitry Marakasov |
| Dmitry Molotkov |
| Dmitry Shalashov |
| Don Seiler |
| Donald Dong |
| Doug Rady |
| Edmund Horner |
| Eduards Bezverhijs |
| Elvis Pranskevichus |
| Emanuel Araújo |
| Emre Hasegeli |
| Eric Cyr |
| Erik Rijkers |
| Ertugrul Kahveci |
| Etsuro Fujita |
| Eugen Konkov |
| Euler Taveira |
| Fabien Coelho |
| Fabrízio de Royes Mello |
| Feike Steenbergen |
| Filip Rembialkowski |
| Gaby Schilders |
| Geert Lobbestael |
| George Tarasov |
| Georgios Kokolatos |
| Gianni Ciolli |
| Gilles Darold |
| Greg Stark |
| Grigory Smolkin |
| Guillaume Lelarge |
| Gunnlaugur Thor Briem |
| Gurjeet Singh |
| Hadi Moshayedi |
| Hailong Li |
| Hans Buschmann |
| Haribabu Kommi |
| Haruka Takatsuka |
| Hayato Kuroda |
| Heikki Linnakangas |
| Hironobu Suzuki |
| Hubert Lubaczewski |
| Hugh Ranalli |
| Ian Barwick |
| Ibrar Ahmed |
| Ildar Musin |
| Insung Moon |
| Ioseph Kim |
| Isaac Morland |
| Ivan Panchenko |
| Jack Kelly |
| Jacob Champion |
| Jaime Casanova |
| Jakob Egger |
| Jakub Glapa |
| Jakub Janecek |
| James Coleman |
| James Inform |
| James Robinson |
| James Sewell |
| James Tomson |
| Jan Chochol |
| Jaroslav Sivy |
| Jean-Christophe Arnu |
| Jean-Marc Voillequin |
| Jean-Pierre Pelletier |
| Jeevan Chalke |
| Jeevan Ladhe |
| Jeff Davis |
| Jeff Janes |
| Jeremy Evans |
| Jeremy Schneider |
| Jeremy Smith |
| Jerry Jelinek |
| Jesper Pedersen |
| Jianing Yang |
| Jie Zhang |
| Jim Nasby |
| Jimmy Yih |
| Joe Conway |
| Joe Wildish |
| Joerg Sonnenberger |
| John Klann |
| John Naylor |
| Jonah Harris |
| Jonathan S. Katz |
| Jorge Gustavo Rocha |
| José Arthur Benetasso Villanova |
| Joshua D. Drake |
| Juan José Santamaría Flecha |
| Julian Hsiao |
| Julian Markwort |
| Julian Schauder |
| Julien Rouhaud |
| Jürgen Purtz |
| Jürgen Strobel |
| Justin Pryzby |
| Kaiting Chen |
| Karen Huddleston |
| Karl Czajkowski |
| Karl O. Pinc |
| Keiichi Hirobe |
| Keith Fiske |
| Ken Tanzer |
| Kenji Uno |
| Kevin Grittner |
| Kevin Hale Boyes |
| Kieran McCusker |
| Kirk Jamison |
| Kohei KaiGai |
| Konstantin Knizhnik |
| Konstantin Kuznetsov |
| Kristjan Tammekivi |
| Kuntal Ghosh |
| Kyle Samson |
| Kyotaro Horiguchi |
| Lætitia Avrot |
| Lars Kanis |
| Laurenz Albe |
| Lim Myungkyu |
| Liu Huailing |
| Liudmila Mantrova |
| Lloyd Albin |
| Luca Ferrari |
| Luis M. Carril |
| Lukas Eder |
| Lukas Fittl |
| Madelaine Thibaut |
| Madeleine Thompson |
| Magnus Hagander |
| Mahendra Singh |
| Mai Peng |
| Maksim Milyutin |
| Maksym Boguk |
| Malthe Borch |
| Manuel Rigger |
| Marco Atzeri |
| Marco Slot |
| Marina Polyakova |
| Mario De Frutos Dieguez |
| Marius Timmer |
| Mark Chambers |
| Mark Dilger |
| Marko Tiikkaja |
| Markus Winand |
| Martín Marqués |
| Masahiko Sawada |
| Masao Fujii |
| Mateusz Guzik |
| Mathias Brossard |
| Matt Williams |
| Matthias Otterbach |
| Matvey Arye |
| Melanie Plageman |
| Mi Tar |
| Michael Banck |
| Michael Davidson |
| Michael Meskes |
| Michael Paquier |
| Michael Vitale |
| Michel Pelletier |
| Mikalai Keida |
| Mike Palmiotto |
| Mithun Cy |
| Morgan Owens |
| Murat Kabilov |
| Nathan Bossart |
| Nawaz Ahmed |
| Neeraj Kumar |
| Nick Barnes |
| Nico Williams |
| Nikita Glukhov |
| Nikolay Shaplov |
| Ning Yu |
| Nishant Fnu |
| Noah Misch |
| Norbert Benkocs |
| Noriyoshi Shinoda |
| Oleg Bartunov |
| Oleg Samoilov |
| Oleksii Kliukin |
| Ondrej Bouda |
| Oskari Saarenmaa |
| Pan Bian |
| Patrick Francelle |
| Patrick McHardy |
| Paul A. Jungwirth |
| Paul Bonaud |
| Paul Guo |
| Paul Martinez |
| Paul Ramsey |
| Paul Schaap |
| Paul van der Linden |
| Pavan Deolasee |
| Pavel Oskin |
| Pavel Raiskup |
| Pavel Stehule |
| Peifeng Qiu |
| Peter Billen |
| Peter Eisentraut |
| Peter Geoghegan |
| Peter Neave |
| Petr Fedorov |
| Petr Jelínek |
| Petr Slavov |
| Petru-Florin Mihancea |
| Phil Bayer |
| Phil Florent |
| Philip Dubé |
| Pierre Ducroquet |
| Piotr Gabriel Kosinski |
| Piotr Stefaniak |
| Piotr Wlodarczyk |
| Prabhat Sahu |
| Quentin Rameau |
| Rafael Castro |
| Rafia Sabih |
| Rahila Syed |
| Rajkumar Raghuwanshi |
| Rares Salcudean |
| Raúl Marín Rodríguez |
| Regina Obe |
| Renaud Navarro |
| Richard Guo |
| Rick Otten |
| Rikard Falkeborn |
| RK Korlapati |
| Robbie Harwood |
| Robert Haas |
| Robert Treat |
| Robert Vollmert |
| Roger Curley |
| Roman Zharkov |
| Ronan Dunklau |
| Rui Hai Jiang |
| Rushabh Lathia |
| Ryan Lambert |
| Ryo Matsumura |
| Ryohei Nagaura |
| Ryohei Takahashi |
| Samuel Williams |
| Sand Stone |
| Sanyo Capobiango |
| Satoru Koizumi |
| Sean Johnston |
| Serge Latyntsev |
| Sergei Kornilov |
| Sergey Pashkov |
| Sergio Conde Gómez |
| Shawn Debnath |
| Shay Rojansky |
| Sho Kato |
| Shohei Mochizuki |
| Shouyu Luo |
| Simon Riggs |
| Sivasubramanian Ramasubramanian |
| Slawomir Chodnicki |
| Stas Kelvish |
| Stefan Kadow |
| Stepan Yankevych |
| Stephen Amell |
| Stephen Frost |
| Steve Rogerson |
| Steve Singer |
| Steven Winfield |
| Surafel Temesgen |
| Suraj Kharage |
| Suresh Kumar R |
| Takayuki Tsunakawa |
| Takeshi Ideriha |
| Takuma Hoshiai |
| Tasos Maschalidis |
| Tatsuo Ishii |
| Tatsuro Yamada |
| Teodor Sigaev |
| Thom Brown |
| Thomas Munro |
| Thomas Poty |
| Tillmann Schulz |
| Tim Möhlmann |
| Timur Birsh |
| Tobias Bussmann |
| Tom Cassidy |
| Tom Dunstan |
| Tom Gottfried |
| Tom Lane |
| Tomas Vondra |
| Tushar Ahuja |
| Ulf Adams |
| Vaishnavi Prabakaran |
| Victor Petrovykh |
| Victor Wagner |
| Victor Yegorov |
| Vijaykumar Jain |
| Vik Fearing |
| Vlad Sterzhanov |
| Vladimir Baranoff |
| Vladimir Kriukov |
| Wu Fei |
| Yaroslav Schekin |
| Yi Huang |
| Yoshikazu Imai |
| Yugo Nagata |
| Yulian Khodorkovskiy |
| Yuming Wang |
| YunQiang Su |
| Yuri Kurenkov |
| Yusuke Egashira |
| Yuzuko Hosoya |
| Zhou Digoal |