PostgreSQL 无法解释的表膨胀

yoh*_*aas 4 postgresql vacuum

我在 Postgres 8.2.15 数据库中有一个表。该表膨胀到近 25GB,但在运行完真空和集群后,表的大小显着变小,远低于 1GB。几周后,它又回到了 3.5GB 并且还在攀升。

这不是一个经常删除的表,所以我不知道是什么导致了膨胀。

这仅发生在单个表上。我有一个单独的、结构相同的数据库,为相同的软件提供服务;该数据库中的表没有显示任何膨胀。

有任何想法吗?

Erw*_*ter 9

您应该升级到更新的版本,最好是当前版本,至少有三个主要原因。

  1. 作为由@a_horse_with_no_name提到自动清理机制在很多地方,因为8.2版本进行了改进。

  2. 你没有看到频繁的DELETEs,所以表膨胀很可能来自@Milen 评论的UPDATEs 。8.3 版引入了一个新功能,从根本上解决了这个问题:Heap-Only Tuples,我引用了发行说明

    Heap-Only Tuples (HOT) 加速了大多数UPDATEs 和 DELETEs 的空间重用(Pavan Deolasee,来自许多其他人的想法)

    UPDATEs 和DELETEs 会留下死元组,失败的INSERTs 也是如此。以前只能VACUUM回收死元组占用的空间。使用 HOT 时,死元组空间可以在索引列未更改时INSERT或未UPDATE更改时 自动回收。这允许更一致的性能。此外,HOT 避免添加重复的索引条目。

    强调我的。

  3. PostgreSQL 8.2 已于2011 年 12 月终止。没有更多的安全更新。尽快升级到更新的版本。

要找出是否有很多UPDATEs 启动,请使用配置参数log_statement并检查您的数据库日志。也许一个错误配置应用程序或触发启动了很多UPDATE比你认为呢?

如果您SET在会话中使用该参数,则它只会在此会话中更改:

SET log_statement = 'all';
Run Code Online (Sandbox Code Playgroud)

所以,宁可在你的postgresql.conf

log_statement = all
Run Code Online (Sandbox Code Playgroud)

并重新加载。例如与pg_ctl reload. 但是不要忘记将其改回(并重新加载),否则您的日志文件可能会变得很大。然后检查日志文件以查看实际发生的情况。