为什么在 postgres 中更新表需要磁盘存储?

问题描述 投票:0回答:1

我需要更新 PostGIS 数据库中的列。

我想用这个来做到这一点:

UPDATE cj_geometry SET groundgeometry = CASE WHEN NOT ST_IsValid(groundgeometry) THEN ST_Multi(ST_CollectionExtract(ST_MakeValid(groundgeometry), 3)) ELSE ST_MakeValid(groundgeometry) END

大约有 65,000,000 行。

我让它运行了一个小时左右,然后意识到设备上没有剩余空间,所以我退出查询并重新启动数据库。它确实重新启动了,但现在超级大,没有新数据。那么两个问题:

  1. 如何恢复到原来的大小?
  2. 为什么会占用这么多磁盘空间?我怎样才能避免这种情况?
postgresql postgis
1个回答
0
投票

要收缩表,请结束所有长时间运行的事务,关闭所有准备好的事务,删除所有过时的复制槽并运行

VACUUM (FULL) table_name;

问题的可能原因是:

  1. 您在单个事务中运行了所有更新,或者存在一个并发的长时间运行的事务

  2. 您运行更新的速度太快,以至于 autovacuum 无法跟上

© www.soinside.com 2019 - 2024. All rights reserved.