暂无图片
暂无图片
5
暂无图片
暂无图片
暂无图片

PostgreSQL 15 特性和PostgreSQL 16 功能预测

原创 小小亮 2023-02-02
2624

PostgreSQL 15 建立在早期版本增强的基础上,并将它们提升到一个新的水平,对逻辑复制进行了多项改进,提高了排序性能,并引入了 MERGE 命令。我想谈谈这些特性以及 PostgreSQL 16 正在讨论的内容。


延续传统,在 PostgreSQL 15 中我们进行了多项改进,还包括一个非常有用的新命令,该命令将简化多个用例中的编码。让我们通过它们。

大纲

  • 逻辑复制改进
  • 合并命令
  • 基地备份
  • 排序性能改进
  • PostgreSQL 16 及更高版本

逻辑复制改进

此版本对逻辑复制进行了多项改进。


  • 支持准备事务到内置逻辑复制。

    用户需要在创建订阅时指定two_phase = true选项,以便可以复制准备好的事务。

CREATE PUBLICATION mypub FOR ALL TABLES;
CREATE SUBSCRIPTION mysub CONNECTION 'dbname=postgres'
       PUBLICATION  mypub WITH (two_phase = true);
  • 这种能力减少了复制数据时的滞后,因为它不会在提交时发送所有事务数据,而是在准备时开始发送数据。它减少了复制数据的延迟,因为准备和提交之间可能存在很长的时间间隔。

    它还为构建无冲突逻辑复制提供了基础。这是因为如果在订阅者应用事务时在准备期间检测到冲突,我们甚至可以在发布者端回滚准备。请注意,这在 PostgreSQL 中不能默认完成,因此我们需要在应用程序中进行一些仔细的更改。

  • 发布现在可以发布架构中的所有表。

    以前,如果用户想发布模式中的所有表,他们需要分别提及每个表。但是有了这个新的子句,模式中的所有表都可以被复制,而不必单独指定。
    这也可以与用户可以指定单个表的现有语法一起使用。

    CREATE PUBLICATION mypub FOR TABLES IN SCHEMA mysch;
    CREATE PUBLICATION mypub FOR TABLE mytab, TABLES IN SCHEMA mysch;
  • 稍后添加到列出的模式中的表也将被复制。

  • 现在可以使用 WHERE 子句过滤发布内容。
    CREATE PUBLICATION mypub FOR TABLE mytab WHERE (c1 > 10);

    这可以帮助在节点之间分发数据并通过有选择地发送数据来提高性能。

    目前,WHERE 子句只允许简单的表达式。它不能包含用户定义的函数、运算符、类型、排序规则、系统列引用或非不可变的内置函数。但请注意,这些限制将来可能会被取消。

    如果发布发布 UPDATE 或 DELETE 操作,则行过滤器 WHERE 子句必须仅包含副本标识所涵盖的列。如果它仅发布 INSERT 操作,则 WHERE 子句可用于任何列。

  • 出版物现在只能发布特定的栏目。

    此功能类似于行过滤器,不同之处在于它允许您将发布限制为列的子集。 

    CREATE PUBLICATION mypub FOR TABLE mytab (c1, c2);

    列列表可以基于行为或性能原因,并且可以只包含简单的列引用。如果该发布还发布了 FOR TABLES IN SCHEMA,则不能指定列列表(但将来也可能取消此限制)。

    如果发布发布 UPDATE 或 DELETE 操作,列列表必须包括表的副本标识列。如果它只发布 INSERT 操作,那么列列表可能会忽略副本标识列。

  • 逻辑复制现在可以作为订阅所有者运行。

    以前,复制必须以超级用户身份运行。只有超级用户、具有 bypassrls 的角色和表所有者才能复制到行级安全策略生效的表中。

  • 以前,可以通过手动删除冲突数据或通过 pg_replication_origin_advance 跳过事务来解决冲突,这两种方法对用户来说都非常棘手。

    在 PostgreSQL 15 中,我们尝试提供一种更简单的方法,允许用户通过指定冲突事务的 LSN 来跳过。 

    ALTER SUBSCRIPTION mysub SKIP (lsn = 0/14C0378)

    用户需要指定的失败事务的 LSN 将在服务器日志中可用。

  • 用户可以设置参数以在发生冲突时自动禁用复制。这对于在没有人为干预的情况下重试不可能成功的场景很有用——例如,在主键违规或其他约束违规无法自动解决的情况下。
  • 新的系统视图 pg_stat_subscription_stats 显示有关在应用逻辑复制更改期间或在初始表同步期间发生的错误的统计信息。


MERGE 命令

PostgreSQL 社区多年来一直致力于 MERGE 功能,PostgreSQL 15 引入了这个命令,它可以处理 INSERT、UPDATE 和 DELETE 操作——所有这些都在一个事务中。

下面的示例将从目标表中插入、更新或删除,具体取决于表是否匹配以及是否满足指定条件。

MERGE INTO TargetProducts Target
USING SourceProducts Source
ON Source.ProductID = Target.ProductID
WHEN NOT MATCHED AND Source.ProductId IS NOT NULL THEN
  INSERT VALUES (Source.ProductID, Source.ProductName, Source.Price)
WHEN MATCHED AND Target.ProductName IN ('Table', 'Desk') THEN
  UPDATE SET ProductName = Source.ProductName, Price = Source.Price
WHEN MATCHED THEN
  DELETE;

如果没有 MERGE,上面的示例将需要具有各种 if-else 条件的 PL 过程或 PL SQL 函数,这也将花费更多的时间来执行。

您必须确保连接为每个目标行最多生成一个候选更改行,否则将出现“ MERGE 命令无法再次影响行”的错误。对于每个候选更改行,将执行第一个评估为 true 的子句。

一个常见的用例是尝试在数据仓库中维护渐变维度 (SCD)。在这种情况下,需要:

  • 向数据仓库中插入新记录,
  • 从仓库中删除不再在源中的记录,并且
  • 更新仓库中已在源中更新的值。


基础备份

这是一个在 PostgreSQL 中已经存在很长时间的特性,并且随着版本的发布而不断发展。这在 PostgreSQL 15 中也得到了改进。pg_basebackup 命令现在允许您指定备份目标并支持各种压缩选项。

目标备份位置使用-t target--target=target指定,其中target可以是client(默认值,会将备份发送到运行命令的机器)、server(将备份存储在服务器上)或blackhole(将丢弃内容,仅用于测试和调试)。请注意,此选项不能与默认 WAL 流选项–Xstream 一起使用。

关于备份的常见抱怨之一是,如果备份很大,则需要更长的时间。所以在这个版本中,我们引入了服务器端压缩和客户端压缩。备份可以在服务器端或客户端压缩,压缩选项为 gzip、LZ4 和 Zstandard(请注意,在 PostgreSQL 15 之前可以使用 gzip 进行客户端压缩)。这些功能允许更快和更小的备份。


排序性能改进

我还想强调在内存和磁盘上引入排序的重要性能改进。

内存排序

不仅提高了内存中排序的性能,而且还对其进行了优化以减少内存消耗。

  • 单列排序的性能提高了 25% 以上。这仅适用于结果包含单个列的情况。

    例如,此改进将适用于SELECT col1 from mytab ORDER BY col1;, 但不是SELECT col1, col2 from mytab ORDER BY col1; .

  • 通过使用生成内存上下文减少了内存使用量。

    我们使用的内存分配方案将请求四舍五入为 2 的下一个幂。性能改进取决于元组大小,但已观察到高达 40% 的改进。

  • 通过为常见数据类型添加专门的排序例程,减少了函数调用开销。

    观察到的改进约为 5%。 

超过 work_mem 的排序

通过切换到使用比以前更多的输出流的批量排序算法,超过 work_mem 的排序性能也得到了改进。改进取决于 work_mem – 值越小,改进越大,观察者有 ~40% 的改进。


PostgreSQL 16 及更高版本

最后,我想列出我注意到在 PostgreSQL 社区中讨论的以及可能包含在 PostgreSQL 16 或更高版本中的功能。我想指出,不能保证这些功能会真正被添加。这只是基于我对 PostgreSQL 社区中讨论的观察的总结——我和社区都不能保证这些功能会被实现。

  • 逻辑复制的各种改进。
    • 通过基于来源的过滤允许相同的表复制。

      目前,同表的双向复制会导致无限循环,但通过基于源的过滤允许同表复制,我们将使此功能无循环。

    • 平行申请
    • 序列复制
    • 从备用启用逻辑复制
    • DDL复制
    • 延时复制
    • 当发布者指定副本身份已满时,在订阅者上使用索引
    • 复制其他对象,例如 LOB
    • ……
  • 减少需要超级用户权限的命令数量。
  • SQL/JSON 增强功能以提高标准合规性。
  • 透明列加密 - 客户端中特定列的自动、透明加密和解密。
  • 通过将其替换为 Meson 构建系统(面向开发人员的功能)来更改构建基础结构。
  • 异步 I/O - 将允许预取数据并提高系统性能。
  • 直接 I/O - 将绕过操作系统缓存并在某些情况下带来更好的性能。
  • 哈希索引的各种改进 - 允许唯一索引和多列索引。
  • 通过使用性能数据结构、更早地推进 relfrozenxid 和减少 WAL 体积来改进 vacuum 技术。
  • 分区技术的改进。
  • 改进统计/监控。
  • 64 位 XID - 可以避免冻结并减少对 autovacuum 的需求。
  • TDE - 可以帮助满足许多组织的安全合规性。
  • 物化视图的增量维护。

对于未来的版本,还有更多的讨论正在进行,但这些是引起我注意的。


原文标题:PostgreSQL 15 and beyond

原文作者:Amit Kapila

原文链接:https://www.postgresql.fastware.com/blog/postgresql-15-and-beyond

最后修改时间:2023-02-02 14:35:10
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论