Postgres autovacuum 何时执行

use*_*531 4 postgresql vacuum postgresql-8.4 autovacuum

我使用的是较旧版本的 Postgres (8.4.20)。我知道 autovacuum 进程经常执行以释放删除或更新表中数据的查询的磁盘空间。我有一个不经常删除或更新的数据库。

在这样的数据库上处理 autovacuum 需要更少的时间和内存,还是仅取决于数据库中对象的大小和数量?

小智 12

首先,不再支持 8.4,因此请考虑升级。

自动清理设置记录

让我们关注影响autovacuum何时启动的设置。您可能知道,此过程负责清理和分析表。

影响ANALYZE频率的设置之一是autovacuum_analyze_threshold。正如您可以从手册中读到的,此参数指定应更改ANALYZE以触​​发的最小行数。这对小表很有用,但在大表和/或高活动表上,这将导致分析过于频繁。为了避免这种情况,存在另一个参数,即autovacuum_analyze_scale_factor。它指定要添加到阈值的表的分数,以检查是否ANALYZE应该启动。

假设我们有一个包含 10,000 行的表,其中 200 行发生了变化:

  1. autovacuum_analyze_threshold告诉我们,我们已经超过了默认值50
  2. 我们计算基于autovacuum_analyze_scale_factor(默认为0.1)的分数,这给了我们 1000 行;
  3. 因此,总计算阈值为1050
  4. 由于 200 小于 1050,ANALYZE因此未启动(我们等待更多更改)。

对于 ,VACCUM还有一对具有完全相似行为的参数:autovacuum_vacuum_thresholdand autovacuum_vacuum_scale_factor,除了吸尘的默认比例是0.2或 20% 。

现在,您可以猜到,您的桌子越大,在其上触发 autovacuum 所需的时间就越多。因此,对于较大的表(通常超过 100 万行),强烈建议调整这些设置。您可以在每个表的基础上使用ALTER TABLE ... SET ( storage_parameter = ... )语法。

设置*_scale_factor为 0 并仅增加较大表的阈值可能很诱人。尽管如此,最好还是将 factor 保持为一个很小但非零的值,因为对于具有高活动性的表 100,000 行更改可能发生得太频繁,从而导致不必要的自动清理。在 pgsql-performance 列表中查看此线程