正如这个 Firefox 错误所引用的,清理数据库的行为是做什么的?所有现代数据库软件都支持此操作,还是仅某些软件支持?
5 回答
使用MVCC将事务彼此隔离的数据库需要定期扫描表以删除过时的行副本。在 MVCC 中,当一行被更新或删除时,它不能立即被回收,因为可能有活动的事务仍然可以看到该行的旧版本。而不是检查是否是这种情况,这可能会非常昂贵,而是假设旧行保持相关。回收空间的过程被推迟到表被清空,这取决于数据库,可以自动或显式启动。
它专门指的是 SQL lite Vacuum 命令。 http://www.sqlite.org/lang_vacuum.html
它正在删除 DELETE 语句中剩余的空间。
'vacuumdb' 在 MySQL、sqlite 和 PostgreSQL 中。在 Postgres 中,vacuumdb 识别已删除行占用的空间并将其编目以备将来使用。'vacuum full' 进行更全面的检查并将记录移动到新创建的空间中。
真空意味着两件事:
- 回收空间
- 碎片整理文件 [种类]
为什么使用真空:
当您删除表、视图、索引和触发器等数据库对象或从表中删除数据时,数据库文件的大小总是会增长,因为 SQLite 只是将删除的对象标记为空闲并保留以供将来使用。
索引和表变得碎片化,具有大量的插入、更新和删除。
未使用的数据块由插入、更新和删除操作创建。
Precautions: Different databases may handle this differently: eg in SQLite if you use unaliased rowid, the VACUUM command will reset the rowid values. but if you use INTEGER PRIMARY KEY column, the VACUUM does not change the values of that column.
Vacuum requires space to copy the database and run the operations.
这与对文件系统进行碎片整理非常相似。有关PGSQL 文档的更多信息。