正如this Firefox bug所引用的那样,抽真空数据库的行为是什么?所有现代数据库软件或仅某些现有数据库软件是否支持此操作?
答案 0 :(得分:34)
使用MVCC隔离事务的数据库需要定期扫描表以删除过时的行副本。在MVCC中,当更新或删除行时,不能立即回收它,因为可能存在仍然可以看到该行的旧版本的活动事务。而不是检查是否是这种情况,这可能是相当昂贵的,旧行被认为保持相关性。回收空间的过程被推迟到表被抽真空,这取决于数据库,可以自动或明确地启动。
答案 1 :(得分:5)
具体是指SQLite vacuum命令。 http://www.sqlite.org/lang_vacuum.html
它正在删除DELETE语句留下的空间。
答案 2 :(得分:1)
'vacuumdb'在MySQL,sqlite和PostgreSQL中。在Postgres中,vacuumdb标识被删除的行占用的空间并将其编目以供将来使用。 'vacuum full'进行更全面的检查,并将记录移动到新创建的空间中。
答案 3 :(得分:0)
这与对文件系统进行碎片整理非常相似。有关PGSQL docs的更多信息。
答案 4 :(得分:0)
真空意味着2件事: 1.回收空间 2.碎片整理文件[种类]
为什么使用吸尘器: 1.删除表,视图,索引和触发器等数据库对象或从表中删除数据时,数据库文件的大小始终会增加,因为SQLite只是将已删除的对象标记为空闲并将其保留以供将来使用。
2个索引和表变得零散,具有大量的插入,更新和删除。
注意事项: 不同的数据库可能会对此进行不同的处理:例如在SQLite中 如果您使用无别名的rowid,则VACUUM命令将重置rowid值。 但 如果您使用INTEGER PRIMARY KEY列,则VACUUM不会更改该列的值。
真空需要空间来复制数据库并运行操作