我运行了一个简单的删除查询来清除一些数据,但由于花费了很长时间而取消了。我注意到在取消查询后,一些表现在占用的空间是以前的两倍多。例如,之前 16GB 的表现在为 28GB(pg_size_pretty 值)
我不想继续删除,因为我想保留数据,但为什么表膨胀这么多?真空完全有帮助吗?如果我运行真空,我是否会面临永久删除数据的风险?
在 PostgreSQL 中,取消长时间运行的删除查询可能会留下一些已标记为删除但尚未从表中物理删除的死(或过时)行。这些死行可能会导致表大小的增加。
VACUUM FULL需要表上的排他锁,这意味着操作期间其他事务无法访问该表。这可能会导致您的应用程序出现停机。
您可能想先尝试常规真空,而不是完全真空。它的攻击性较小,并且锁定和性能影响较小。
VACUUM <your_table_name>;
运行vacuum后,考虑运行ANALYZE来更新统计信息,这可以帮助查询规划者就如何执行查询做出更好的决策。
ANALYZE <your_table_name>;
如果您担心潜在的数据丢失,那么在对数据库执行维护操作之前进行最近的“备份”总是一个好主意。这样,如果出现意外情况,您可以恢复数据。