有一张桌子(我们称之为logs)。它已经积累了33GB的记录。它需要清理干净。试图做
DELETE FROM logs
但是运行命令一段时间后,输出显示第N(数量很大)行数被删除了,但表的大小保持不变(我想行数也没有改变)。这是我第一次遇到这个问题,我不知道该怎么办。
实际上,一个问题:如何从表中删除所有数据logs?
该表只有一个主键,没有索引。
有一张桌子(我们称之为logs)。它已经积累了33GB的记录。它需要清理干净。试图做
DELETE FROM logs
但是运行命令一段时间后,输出显示第N(数量很大)行数被删除了,但表的大小保持不变(我想行数也没有改变)。这是我第一次遇到这个问题,我不知道该怎么办。
实际上,一个问题:如何从表中删除所有数据logs?
该表只有一个主键,没有索引。
如果您需要完全删除所有内容,那么您需要
truncate.delete从不直接返回磁盘空间。PostgreSQL - MVCC 基础,delete仅将一行标记为已删除。然后来autovacuum(或手动调用vacuum),它会从表文件中清除任何人不再可以访问的死行版本。在表的末尾检查vacuum以查看表末尾是否有没有剩余行的数据页。如果有,那么它会尝试截断表的大小。索引大小本身永远不会减少(这需要reindex)。此外,所有这些操作都是用 wal 完整编写的,这增加了乐趣。truncate它只是分配新的空数据文件并删除旧的。因此,对于清除一切的任务来说,效率是无比高的。虽然它需要排他锁。