Postgresql-从500Gb数据库/自动吸尘器中大幅度删除?

Postgresql-从500Gb数据库/自动吸尘器中大幅度删除?,postgresql,vacuum,autovacuum,Postgresql,Vacuum,Autovacuum,我需要删除大约80%的500Gb Postgresql数据库。 到目前为止,我已经成功地为大约50Gb的行运行了delete命令,并在继续之前暂停。(这花了很长时间,也许一个小时) 我注意到,在删除了大约50Gb的数据后,不会释放额外的磁盘空间,但在运行“htop”时,可以观察到一些内存密集型的postgres进程。我假设这是死行,需要在释放磁盘空间之前清空这些死行,对吗 这个问题的第二部分是,如果我没有弄错第一部分,我是否最好删除所有行,然后允许自动真空发生?在我有机会继续我的行删除命令列表之

我需要删除大约80%的500Gb Postgresql数据库。 到目前为止,我已经成功地为大约50Gb的行运行了delete命令,并在继续之前暂停。(这花了很长时间,也许一个小时)

我注意到,在删除了大约50Gb的数据后,不会释放额外的磁盘空间,但在运行“htop”时,可以观察到一些内存密集型的postgres进程。我假设这是死行,需要在释放磁盘空间之前清空这些死行,对吗


这个问题的第二部分是,如果我没有弄错第一部分,我是否最好删除所有行,然后允许自动真空发生?在我有机会继续我的行删除命令列表之前,自动真空(或其他密集的后台处理)似乎已经自行启动。我是继续还是应该优雅地告诉它先停止?

在一次大的删除之后,autovacuum肯定会运行。这是设计好的,不应该影响您删除更多的行

虽然autovacuum会释放表中的死空间,但不会将空间返回到操作系统。相反,它在表中保留为可用空间,可以在将来的插入中重用

如果要收缩表,请在表上运行
VACUUM(FULL)
,但请注意,这会重写表,因此会临时使用额外的存储空间并阻止表上的所有并发活动


如果必须定期进行类似的质量删除,请考虑对表进行分区。它使批量删除变得轻松。

更好的解决方案是
截断表

在我的场景中,我删除了一个占用大量磁盘空间的特定行,但它的数据太多,
VACUUM
无法在合理的时间内清除

我最终复制了这张桌子:

CREATE table dupe_table AS (SELECT * FROM table);
截断原始表:

TRUNCATE table
最后,将数据移回:

INSERT INTO table(column1, column2, column3)
SELECT column1, column2, column3
FROM dupe_table

注意:如果在创建重复表和截断原始表之间发生事务,则可能会丢失数据。

autovacuum不会执行
真空满
——因此它不一定会释放已删除的元组磁盘空间,但会将它们标记为可重用。是的,这很正常。否-您不应该关心它-继续您的工作,让autovacuum执行其任务