【发布时间】:2011-01-08 20:35:21
【问题描述】:
正如this Firefox bug 所引用的,清理数据库的行为是什么?是所有现代数据库软件都支持此操作,还是只有某些软件支持?
【问题讨论】:
标签: database terminology vacuum
正如this Firefox bug 所引用的,清理数据库的行为是什么?是所有现代数据库软件都支持此操作,还是只有某些软件支持?
【问题讨论】:
标签: database terminology vacuum
这与对文件系统进行碎片整理非常相似。有关PGSQL docs 的更多信息。
【讨论】:
特指SQL lite Vacuum 命令。 http://www.sqlite.org/lang_vacuum.html
它正在删除 DELETE 语句中剩余的空间。
【讨论】:
使用MVCC 将事务彼此隔离的数据库需要定期扫描表以删除过时的行副本。在 MVCC 中,当一行被更新或删除时,它不能立即被回收,因为可能有活动的事务仍然可以看到该行的旧版本。而不是检查是否是这种情况,这可能会非常昂贵,而是假设旧行保持相关。回收空间的过程被推迟到表被清空,这取决于数据库,可以自动或显式启动。
【讨论】:
'vacuumdb' 在 MySQL、sqlite 和 PostgreSQL 中。在 Postgres 中,vacuumdb 识别已删除行占用的空间并将其编目以备将来使用。 'vacuum full' 进行更全面的检查并将记录移动到新创建的空间中。
【讨论】:
真空意味着两件事:
为什么要使用真空:
当您删除表、视图、索引和触发器等数据库对象或从表中删除数据时,数据库文件的大小总是会增长,因为 SQLite 只是将删除的对象标记为空闲并保留以供将来使用。
索引和表变得碎片化,有大量的插入、更新和删除。
未使用的数据块由插入、更新和删除操作创建。
注意事项: 不同的数据库可能会以不同的方式处理这个问题:例如在 SQLite 如果您使用非别名 rowid,VACUUM 命令将重置 rowid 值。 但如果您使用 INTEGER PRIMARY KEY 列,则 VACUUM 不会更改该列的值。
Vacuum 需要空间来复制数据库和运行操作。
【讨论】: