为什么我的postgres表在更新时变得更大?

时间:2014-06-02 05:31:33

标签: postgresql

我有一张桌子,分为两列(销售点和产品ID)。唯一的索引是在这两列中,表格聚集在这些列上。

每周更新表中的其他列。当我这样做时,表和关系的大小增加了大约5倍。然后我对表进行聚类,大小恢复为更新前的状态。

这对我来说很奇怪。如果我正在更新索引列,我预计会有一些我需要通过吸尘处理的膨胀,但由于索引列未被任何更新修改,我不明白为什么更新表格会导致规模增加。

这是否按预期工作,或者这是否指向我配置中的问题?有办法阻止这个吗?

[Windows 7上的Postgres 9.1]

1 个答案:

答案 0 :(得分:4)

即使没有索引列,PostgreSQL仍然需要进行MVCC更新,它会写入一个新行,然后进行真空吸尘并丢弃旧行。否则,如果在中途发生错误或崩溃,则无法回滚事务。 (PostgreSQL没有撤销日志,而是使用堆)。

HOT updates只有在页面中有足够的可用空间时才能完成,以避免必须将新行写入不同的页面,然后必须创建新的索引条目。因此,即使您没有更新索引列,PostgreSQL仍然必须在表的末尾向新页面写入新行,因为无法将新行版本放在当前页面上。 / p>

我通常只会期望空间增加一倍,但如果您在没有真空追赶的情况下进行一系列更新,那么预计会有更多的增加。尝试一次性完成所有更新,或者在两次传递之间VACUUM

要以某些磁盘空间为代价更快地更新,ALTER TABLEFILLFACTOR之前在您的桌面上设置非100 CLUSTER。我建议45,每行的一个新版本加上一个小摆动空间就足够了。这会使表的大小增加一倍,但会减少所有重写的流失。它会让HOT更新发生并加速更新,因为它不需要一直扩展关系。

最重要的是 - 尝试找到一种方法来避免定期批量更新整个表。