删除行并获得空间 postgresql

Mic*_*zum 3 sql postgresql autovacuum

我对 postgresql 没有经验。

做了一个简单的命令

DELETE FROM table_name where some_condition;
Run Code Online (Sandbox Code Playgroud)

涉及数千行。但实际上在该命令之后,磁盘空间变得更小。

知道出了什么问题吗?我启用了 autovacuum = on 并尝试执行 'VACUUM FULL;' 但这消耗了我的整个磁盘空间。

我想做的很简单。删除行并获取空间。涉及的空间很大,机器上没有多少空间。有没有办法做到这一点?

Erw*_*ter 5

autovacuum除非您确切地知道自己在做什么,否则应该在任何现代 Postgres 数据库中运行。但是除了罕见的极端情况外,autovacuum不会缩小表。它调度定期VACUUMANALYZE作业,但从 调度VACUUM FULL,这会在已处理的表和索引上获取排他锁。VACUUM但是,通过清理死元组(以及其他各种好行为),从而为将来对同一对象的写入操作提供可用空间,而不是将空间返回给操作系统,这有助于避免表和索引膨胀。

你写:

试图执行 'VACUUM FULL;' 但这消耗了我的整个磁盘空间。

你是说暂时?因为这就是VACUUM FULL它的作用。但是当它完成时,表和关联的索引会减少到它们的最小大小——这通常是不可取的,除非您迫切需要磁盘空间或永远不会更新行。

所以VACUUM FULL 适合您的工具,除非您的磁盘空间已经用完 - 最好不要一开始就发生这种情况。所以你需要创造一些回旋余地,让它发挥它的魔力。

还有社区工具pg_repack,它可以做与VACUUM FULL没有排他锁一样的事情。但它也需要一些可用磁盘空间才能工作。更详细的相关答案:


要删除表的所有行并立即释放磁盘空间,请使用TRUNCATE. 它有效地在磁盘上写入一个新文件并删除旧文件。这也是它通常不能与 DB 上的并发负载一起使用的原因。

TRUNCATE table_name;
Run Code Online (Sandbox Code Playgroud)