📜  PostgreSQL – 自动清理

📅  最后修改于: 2021-09-08 16:23:48             🧑  作者: Mango

在 2000 年代的某个时候,PostgreSQL 的开发人员在其关系数据库管理系统的设计中发现了存储空间和事务速度方面的重大漏洞。结果证明 UPDATE 查询正在变成一个昂贵的例程。 UPDATE 是复制旧行并重写新数据,这意味着数据库或表的大小不受任何限制!此外,删除一行只会标记删除的行,而实际数据保持不变——稍后支持数据取证。

这听起来可能很熟悉,因为它是当今文件系统和数据恢复软件所依赖的,即数据在删除时以原始形式在磁盘上保持完整,但隐藏在界面上。但是,保留旧数据对于旧交易也很重要。所以从技术上讲,在交易完整性上妥协是不对的。这是足够的刺激,Postgres 团队很快引入了“真空”功能,从字面上真空已删除的行。然而,这是一个手动过程,由于所涉及的函数的数个参数,这是不可取的。因此,开发了自动真空。

什么是自动吸尘器?

Autovacuum 是 PostgreSQL 提供给用户的守护进程后台实用程序进程,用于定期清理数据库和服务器中的冗余数据。它不需要用户手动发出真空,而是在postgresql.conf文件中定义。要访问此文件,只需将自己定向到终端上的以下目录,然后在合适的编辑器中打开该文件。

>> cd C:\Program Files\PostgreSQL\13\data
>> "postgresql.conf"

在命令提示符下实现时:

autovacuum 实用程序将删除的数据块(标记为已删除的块)重新分配给新事务,方法是首先删除死/过时的元组,然后通知排队的事务可以在表中放置任何更新或插入。这与旧的和以前的程序形成鲜明对比,在旧程序中,事务会盲目地插入具有相同标识元素和更新属性的新数据行。自动清扫的好处非常明显:

  • 存储空间得到了很好的利用。
  • 改进了自由空间地图的可见性。 FSM 是多个二叉树的映射,指示关系/表中的可用空间。
  • 与手动吸尘器不同,它们不需要时间和资源。
  • 它们不会在表上放置排他锁(FULLvacuum 在想要访问表的事务上放置锁)。
  • 防止表膨胀。膨胀是一个过程,通过该过程,表的大小会因不必要的和无效的数据而达到巨大的值。

监视事务前后数据大小的一种方法是在连接到特定数据库后在 Shell 中执行以下代码行:

postgresql=# SELECT pg_size_pretty(pg_relation_size('table_name');

考虑一个存储收费站客户帐户的表:

该表的大小由下式给出:

如果发生事务,则可以再次处理此查询以证明表大小的变化。大小的不成比例变化将表明自动清理失败(如果即使事务对过时的行状态没有用,大小也不会改变)。

配置自动清理

由于 autovacuum 是一个后台实用程序,因此默认情况下它是打开的。但是,请记住,它是在很久以前开发的,因此参数设置是保守的,即根据硬件的可用性和软件版本设置参数。现代应用要求检查这些参数并按比例调整它们。我们将快速查看节点参数:

postgresql.conf 文件中的 AUTOVACUUM 部分。

  • autovacuum:默认情况下设置为“on”,因此它可能不会在 shell 或终端中专门声明。
  • autovacuum_naptime:此参数设置为 1 分钟或 60 秒,表示连续自动清理调用或唤醒之间的持续时间。
  • autovacuum_max_workers:这表示每次在’naptime’之后函数被唤醒时被清空的进程数。
  • autovacuum_vacuum_scale_factor:通常设置为0.2,这意味着autovacuum仅在关系/表的20%已更改/更新时才进行清理。
  • autovacuum_vacuum_threshold:预防措施,此参数确保仅在对表进行一定数量的更改(默认为 50)时才会发生自动清理。
  • autovacuum_analyze_scale_factor:这是在事务期间创建表的常规统计信息的分析实用程序。如果设置为 0.1,则仅当表的 10% 观察到更新(删除、更新、插入、更改等)时才进行分析。
  • autovacuum_analyze_threshold:类似于 autovacuum_vacuum_threshold,虽然这里执行的操作是分析。仅当事务至少进行了 50 次更改时才执行分析。

这些参数根据事务影响数据库的频率以及数据库的增长或预期增长的大小进行修改。所以,如果交易似乎以更快的速度在发生,autovacuum_max_workers可以增加或者如果不希望交易需求较旧的数据autovacuum_vacuum_scale_factor可能会降低。此外,开发人员可以调整分析参数以制定更好的查询技术。

这让我们质疑经常分析表格背后的想法。

哪些表需要分析?

分析可以手动进行,也可以简单地通过保持自动真空开启来进行。 Analysis 提供有关数据库的特定统计信息,帮助开发人员提高效率。本质上,分析提供以下信息:

  1. 关系/表的特定列中最常见值的列表。在某些情况下,这不是必需的,因为该列可能是唯一标识符 – 不能期望唯一标识符在表中重复。
  2. 数据分布的直方图。这可能包括与列相关的数据大小或哪些列受事务的最高和最低更新影响。

现在回答相关问题——哪些表实际上需要分析。通过自动真空,大多数表都可以进行分析。然而,在发出显式 ANALYZE函数的可能情况下,它是由于以下原因而完成的:

  • 当 UPDATE 活动似乎不直接影响某些列时使用。可能需要某些列的统计信息,而这些列的统计信息不会被正在进行的事务更改。因此,自动分析可能无关紧要。
  • 分析对于保持与更新发生率相关的表的标签很重要。
  • 了解数据的哪些方面最不容易发生变化以建立模式。

另一个可能提出的问题是 – 如何将必须单独发布的分析守护程序列入候选表?

有一个简单的经验法则:只要列的最小值或最大值容易发生变化,就可以对表进行分析。例如,显示速度枪测量的车辆速度的表格必然会改变其最大值。因此,分析将得出结论。