PostgreSQL 11:分区从 Postgres 9.6 到 Postgres 11 的演变

祝大家星期五愉快! 距离课程开始的时间越来越少 《关系型数据库管理系统》,所以今天我们分享另一个关于该主题的有用材料的翻译。

开发中 PostgreSQL 11 在改进表分区方面已经做了一些令人印象深刻的工作。 分区表 - 这是一个在 PostgreSQL 中存在了相当长一段时间的函数,但是可以说,直到版本 10 之前它基本上不存在,在版本 XNUMX 中它成为一个非常有用的函数。 我们之前说过表继承是我们分区的实现,这是事实。 只有这种方法迫使您手动完成大部分工作。 例如,如果您希望在 INSERT 期间将元组插入到节中,则必须配置触发器来为您执行此操作。 通过继承进行分区非常慢并且难以在其上开发附加功能。

在 PostgreSQL 10 中,我们看到了“声明式分区”的诞生,该功能旨在解决许多使用旧的继承方法无法解决的问题。 这导致了一个更强大的工具,使我们能够水平分割数据!

特性比较

PostgreSQL 11 引入了一组令人印象深刻的新功能,有助于提高性能并使分区表对应用程序更加透明。

PostgreSQL 11:分区从 Postgres 9.6 到 Postgres 11 的演变
PostgreSQL 11:分区从 Postgres 9.6 到 Postgres 11 的演变
PostgreSQL 11:分区从 Postgres 9.6 到 Postgres 11 的演变
1. 使用限制性例外
2.仅添加节点
3. 仅适用于引用非分区表的分区表
4.索引必须包含分区的所有键列
5. 两侧的截面限制必须匹配

Производительность

我们这里也有好消息! 添加了新方法 删除部分。 这种新算法可以通过查看查询条件来确定合适的部分 WHERE。 之前的算法依次检查每个部分以确定是否满足条件 WHERE。 随着部分数量的增加,规划时间也随之增加。

在 9.6 中,通过继承进行分区,将元组路由到分区通常是通过编写一个触发器函数来完成的,该函数包含一系列 IF 语句以将元组插入到正确的分区中。 这些函数的执行速度可能非常慢。 通过在版本 10 中添加声明性分区,此操作速度更快。

使用具有 100 个分区的分区表,我们可以评估将 10 万行加载到具有 1 个 BIGINT 列和 5 个 INT 列的表中的性能。

PostgreSQL 11:分区从 Postgres 9.6 到 Postgres 11 的演变

查询该表以查找一条索引记录并执行 DML 操作一条记录的性能(仅使用 1 个处理器):

PostgreSQL 11:分区从 Postgres 9.6 到 Postgres 11 的演变

这里我们可以看到自PG 9.6以来各个操作的性能都有了显着的提升。 要求 SELECT 看起来好多了,尤其是那些能够在查询规划期间排除多个分区的分区。 这意味着调度程序可以跳过许多它之前应该完成的工作。 例如,不再为不必要的部分构建路径。

结论

表分区开始成为 PostgreSQL 中非常强大的功能。 它允许您快速在线显示数据并将其离线,而无需等待缓慢、大量的 DML 操作完成。。 这也意味着相关数据可以存储在一起,这意味着可以更有效地访问您需要的数据。 如果没有开发人员、审阅者和提交者在所有这些功能上的不懈努力,这个版本中所做的改进是不可能实现的。
感谢他们所有人! PostgreSQL 11 看起来棒极了!

这是一篇简短但非常有趣的文章。 分享您的评论,别忘了注册 开放日,其中将详细概述课程计划。

来源: habr.com

添加评论