我应该在进行批量更新时禁用表上的自动清理吗?

jpm*_*c26 9 postgresql bulk autovacuum

我需要对表中的所有行执行简单的更新。该表有 40-50 百万行。在此期间删除索引和约束会UPDATE导致巨大的性能改进。

但是自动吸尘器呢?autovacuum 可以启动 aVACUUM还是ANALYZE在 a 的中间UPDATE?如果是这样,那会消耗机器资源的无用工作。我可以先在桌子上禁用它UPDATE,然后再重新启用它:

ALTER TABLE my_table
SET (autovacuum_enabled = false, toast.autovacuum_enabled = false);
-- Drop constraints, drop indexes, and disable unnecessary triggers

UPDATE my_table SET ....;

-- Restore constraints, indexes, and triggers
ALTER TABLE my_table
SET (autovacuum_enabled = true, toast.autovacuum_enabled = true);
Run Code Online (Sandbox Code Playgroud)

如果我在第一个之后不提交,这甚至有效ALTER吗?

另外,如果我在禁用它UPDATE,将它触发的更新,还是会因为它是他们中禁用它忽略这些更新?(我怀疑它会运行,但我宁愿确定。)

我现在正在使用 PG 9.3,但应该很快就会升级。因此,任何提及新版本更改的内容都值得赞赏。

Eva*_*oll 7

根本没有意义。autovacuum不会清除正在运行的事务中锁定的任何行。所以autovacuum

  • 可能不会做任何有用的事情。
  • 可能会报告行已死不可移动
  • 可以对其他行做一些有用的事情(如果有的话)。

但是,它不会阻止或减慢我所知道的任何有意义的更新。

  • autovacuum 会访问磁盘上的数据库文件吗? (2认同)