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

大家星期五好! 关系DBMS课程的开办时间越来越少,因此今天我们将分享有关该主题的另一种有用材料的翻译。



PostgreSQL 11的开发过程中,为改善表分区所做的出色工作。 表分区是在PostgreSQL中已经存在了一段时间的功能,但是可以说,实际上它直到版本10才真正存在,在该版本中,它变得非常有用。 前面我们曾说过,表继承是分区的实现,这是事实。 只有这种方法迫使您手动执行大部分工作。 例如,如果要在INSERT期间将元组插入节中,则必须配置触发器来为您执行此操作。 使用继承进行分区非常缓慢,并且难以在其之上开发其他功能。

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

功能比较

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




1.使用限制性例外
2.仅添加节点
3.仅对于引用了非分区表的分区表
4.索引必须包含一个节的所有关键列
5.两侧部分的限制必须匹配

性能表现

在这里,我们也有一些好消息! 添加了一种删除节的新方法。 该新算法可以通过查看WHERE查询条件来确定合适的部分。 反过来,先前的算法会检查每个部分,以确定是否可以匹配WHERE 。 随着部分数量的增加,这导致计划时间的额外增加。

在9.6中,通过继承进行分区,通常通过编写包含一系列IF语句的触发函数将节中的元组插入正确的节中,从而在节中路由元组。 这些功能执行起来可能很慢。 在版本10中添加了声明性分区后,这变得更快了。

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



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



在这里我们看到,PG 9.6之后,每个操作的性能都显着提高。 SELECT查询看起来要好得多,尤其是那些可以在查询调度期间排除多个部分的查询。 这意味着调度程序可以跳过之前应该完成的大部分工作。 例如,不再构建不必要部分的路径。

结论

分区表已开始成为PostgreSQL中非常强大的功能。 它使您可以快速在线输出数据并离线转换数据,而无需等待缓慢的大规模DML操作完成 。 它还意味着可以将相关数据存储在一起,即可以更有效地访问所需数据。 没有开发人员,审阅者和提交者不遗余力地使用所有这些功能,就不可能在此版本中进行改进。
感谢所有人! PostgreSQL 11看起来很棒!

这是一篇简短但有趣的文章。 分享您的评论,不要忘记注册一个开放日 ,其中将详细描述课程计划。

Source: https://habr.com/ru/post/zh-CN452280/


All Articles