PG 11新特性汇总

0    658    1

Tags:

👉 本文共约16834个字,系统预计阅读时间或需64分钟。

1. 概述

PostgreSQL11的主要改进有:

  • 分区功能的改进,包括:

    • 增加用哈希键分区的支持
    • 增加分区表上PRIMARY KEY, FOREIGN KEY,索引和触发器的支持
    • 允许创建“default”分区,以存储与其余分区都不匹配的数据
    • 改变分区键列的UPDATE语句现在会导致受到影响的行移动到适当的分区
    • 在查询计划和执行时通过增强分区排除策略来提高SELECT性能
  • 并行性改进,包括:

    • 现在构建B-树索引时CREATE INDEX可使用并行处理
    • 现在CREATE TABLE ... AS,CREATE MATERIALIZED VIEW和某些使用UNION的查询中并行是可能的
    • 并行化的哈希连接和并行化顺序扫描现在表现更好
  • 支持嵌入式事务的SQL存储过程

  • 对于一些SQL代码,可用即时(JIT)编译加速表达式评估

  • 窗口函数现在支持SQL:2011标准中的所有帧选项,包括RANGE *distance *PRECEDING/FOLLOWING, GROUPS模式和帧排除选项

  • 现在使用 CREATE INDEXINCLUDE子句可创建覆盖索引

  • 其它很多有用的性能改进,包括在ALTER TABLE ... ADD COLUMN以非空列作为缺省时避免对表重写的能力

以上的项在下面的章节中详细说明。

2. 迁移到版本11

要从任何以前的版本迁移数据,需要使用pg_dumpall或使用pg_upgrade来转储/恢复。

版本11包含一些影响到与以前的版本的兼容性的修改。注意以下不兼容的方面:

  • 使pg_dump转储数据库属性,而不仅仅是其内容 (Haribabu Kommi)

    以前,数据库本身的属性,例如数据库级的GRANT/REVOKE权限和ALTER DATABASE SET变量设置,仅由pg_dumpall来转储。现在pg_dump --createpg_restore --create将恢复数据库中的属性和对象。pg_dumpall -g现在仅转储角色和表空间相关属性。pg_dumpall的全部输出(无-g)未改变。

    pg_dump和pg_restore,没有--create选项时,不在转储/恢复数据库级注释和安全标记,这些内容现在被当作数据库属性。

    pg_dumpall的输出脚本现在创建数据库时总与其原来的区域设置和编码一起,所以如果目的系统的区域设置和编码名称未知的话,就会失败。以前,如果数据库的区域设置和编码与旧集群的缺省设置匹配的话,则CREATE DATABASE命令无此要求即被发出。

    pg_dumpall --clean现在可恢复postgrestemplate1数据库原来的区域设置和编码设置,这与用户创建的数据库是一样的。

  • 消除函数与列引用的歧义时考虑句法形式 (Tom Lane)

    x是表名或复合列时,PostgreSQL通常认为*f*(*x*)*x*.*f*的句法形式是等价的。这就允许类似于写一个函数,然后使用时它象是一按需计算的列这样的小把戏。但是,如果两种解释都可行,一般总选择列解释,就会导致用户需要函数解释时出现奇怪的结果。现在,如果有歧义,将选择匹配句法形式的解释。

  • 完全强制表和域约束名的唯一性 (Tom Lane)

    PostgreSQL要求表名不同,约束名也不同。但是,对此没有严格的强制措施,以前出现过相同名可以创建的特殊案例。

  • 使power(numeric, numeric)power(float8, float8)按POSIX标准处理NaN输入 (Tom Lane, Dang Minh Huong)

    POSIX要求NaN ^ 0 = 11 ^ NaN = 1,所有其他有NaN输入的情况都应返回NaN。在这些所有的情况下,power(numeric, numeric)正好返回NaN;现在接受两种异常。power(float8, float8)遵循标准只要C库支持;但在一些老的Unix平台上C库并未遵循标准,在Windows的一些版本上也有问题。

  • 防止to_number()在模板分隔符不匹配时消耗掉字符 (Oliver Ford)

    特别地,SELECT to_number('1234', '9,999')过去返回134,现在返回1234LTH现在仅消掉非数字、正/负符号、小数点和逗号的字符。

  • 修复to_date(),to_number()to_timestamp(),对于每个模板字符跳过一个字符 (Tom Lane)

    以前,对于模板字符的每一字节,跳过一个byte\。如果字符串包含多字节字符,则导致奇怪的行为。

  • 调整to_char(),to_number()to_timestamp()模板字符串中双引号内的反斜杠的处理。

    现在反斜杠将对其后面的字符转义,特别是双引号或其它反斜杠。

  • 正确处理xmltable(), xpath()和其他XML处理函数中的相对路径表达式 (Markus Winand)

    根据SQL标准,相对路径是从XML输入文档的文档节点开始,而不是这些函数以前所用的根节点。

  • 扩展查询协议中,使statement_timeout独立地应用于每个Execute消息,而不是Sync前的所有命令 (Tatsuo Ishii, Andres Freund)

  • 从系统目录pg_class删除relhaspkey列(Peter Eisentraut)

    需要检查主键的应用程序应查询pg_index

  • 系统目录pg_procproisaggproiswindow列被替换为prokind (Peter Eisentraut)

    新的列可更清晰地区分函数、过程、聚集和窗口函数。

  • 纠正信息模式列tables.table_type,返回FOREIGN而不是FOREIGN TABLE (Peter Eisentraut)

    新输出符合SQL标准。

  • 修改后台工作者的ps进程显示标记以匹配pg_stat_activity.backend_type标记 (Peter Eisentraut)

  • 使大对象的权限检查在大对象打开即lo_open()时进行,而不是在尝试读和写时进行 (Tom Lane, Michael Paquier)

    如果写访问已请求且未可用,现在会抛出一条错误,即使该大对象从未被写过。

  • 防止非超级用户重建共享的目录索引 (Michael Paquier, Robert Haas)

    以前,允许数据库的拥有者这么做,但现在被看作是在其权限边界之外。

  • 移除过时的adminpack函数pg_file_read(),pg_file_length()pg_logfile_rotate() (Stephen Frost)

    相同的功能现在在核心后端中。现有的adminpack安装可继续访问这些函数,直到用ALTER EXTENSION ... UPDATE更新为止。

  • 遵守双引号命令选项的大写(规则)(Daniel Gustafsson)

    以前,特定SQL命令中的选型名称是强制小写,即使有双引号;比如"FillFactor"将接受为索引存储选项,尽管其名字应为小写。这种情况现在会产生错误。

  • 移除服务器参数replacement_sort_tuples (Peter Geoghegan)

    经确认,不再使用替换排序。

  • 移除CREATE FUNCTION中的WITH子句 (Michael Paquier)

    关于这种功能的一种更符合标准的语法,PostgreSQL已支持了很久。

  • PL/pgSQL触发器函数中,没有赋值时,变量OLDNEW现在读出来是NULL (Tom Lane)

    以前,对这些变量的引用可被解析但不执行。

3. 修改列表

下面是PostgreSQL11和以前主版本间的变更的详细说明。

3.1. 服务器

3.1.1. 分区

标签:

Avatar photo

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

发表回复

嘿,我是小麦,需要帮助随时找我哦。
  • 18509239930
  • 个人微信

  • DB宝
  • 个人邮箱
  • 点击加入QQ群
  • 个人微店

  • 回到顶部