PostgreSQL中可怕的VACUUM故事


PostgreSQL 是一个功能强大的开源对象关系数据库系统,因其稳健性、功能性和灵活性而备受赞誉。然而,它并非没有挑战——其中之一就是臭名昭著的 VACUUM 过程。

PostgreSQL 中的 VACUUM 进程是一个历史工件,其根源可以追溯到 Berkley Postgres 项目,该项目实现了一个称为无限时间旅行的概念。这个概念虽然在当时具有创新性,但最终被 PostgreSQL 社区放弃。然而,它导致了多版本并发控制(MVCC)系统的实现容易出现表膨胀。

PostgreSQL MVCC 系统虽然有利于处理并发事务,但也引入了手动清理的需求。这是一个清除旧的、不需要的数据以释放空间并确保高效的数据库操作的过程。

然而,手动清理是一项劳动密集型任务,也是系统效率低下的潜在根源。

PostgreSQL 社区在不断努力改进系统的过程中,引入了 autovacuum - 一种自动清理过程,旨在减轻手动清理的需要。这是向前迈出的重要一步,但并不是一个完美的解决方案。

autovacuum 过程虽然是自动的,但仍然消耗大量的系统资源。这是Uber 决定从 PostgreSQL 迁移到 MySQL 的原因之一,也是Richard Branson 讨厌 PostgreSQL 的 10 件事之一。

随着堆元组 (HOT) 更新和 microvacuum 的实施,进一步增强了功能,这两项重大改进都减少了对全表真空的需求。然而,尽管取得了这些进步,VACUUM 过程仍然是一个资源密集型操作。

此外,PostgreSQL 表仍然容易膨胀,这个问题至今仍然困扰着许多用户。这是OtterTune 团队最讨厌的 PostgreSQL 部分

尽管面临这些挑战,许多组织和开发人员仍然继续使用和支持 PostgreSQL。它的稳健性、可扩展性和强大的社区只是其中的几个原因。例如,OtterTune 尽管承认 PostgreSQL 的问题,但仍决定坚持使用它。他们在另一篇博客文章中解释了他们的原因,强调了在做出决定之前考虑系统整体优点和缺点的重要性。

OrioleDB是一种专为 PostgreSQL 设计的新颖引擎,有望消除对资源消耗型 VACUUM 的需求。

OrioleDB 是 PostgreSQL 的一个突破性的新引擎,其开发的主要目标是:避免表膨胀并消除像 VACUUM 这样的定期维护的需要。它通过实现行级和块级撤消日志以及自动页面合并来实现这一点。

行和块级别的撤消日志提供更精细的控制级别,从而可以更有效地处理数据更改。自动页面合并功能在后台不知疲倦地工作,整合碎片数据,进一步提高系统的效率。

OrioleDB 中这些功能的实现使得系统需要更少的手动干预,消耗更少的资源,并且不易出现表膨胀。这有望显着提高 PostgreSQL 的性能和用户体验。

OrioleDB 提供了:

  • TPS 提高 5 倍,
  • 每个事务的 CPU 负载减少 2.3 倍,
  • 每个事务的 IOPS 减少 22 倍,
  • 没有表和索引膨胀。