什么是数据库清理(vacuum)?

43

正如这个Firefox漏洞所提到的,清理数据库的操作是什么意思?所有现代数据库软件都支持这个操作吗,还是只有某些软件支持?

5个回答

59

使用多版本并发控制(MVCC)隔离每个事务的数据库需要定期扫描表以删除过时的行副本。在MVCC中,当更新或删除一行时,不能立即回收该行,因为可能仍有活动事务可以看到该行的旧版本。为了避免检查这种情况,这些旧行被认为仍然相关。回收空间的过程推迟到表被清理之前进行,具体取决于数据库,可以自动或显式地启动。


9

4

清理(Vacuum)指的是两件事情:

  1. 回收空间
  2. 整理文件 [有点像磁盘碎片整理]

为什么要使用Vacuum:

  1. 当您删除数据库对象(如表、视图、索引和触发器)或从表中删除数据时,数据库文件的大小始终会增长。因为SQLite只是将已删除的对象标记为空闲,并保留其供将来使用。

  2. 索引和表在进行大量插入、更新和删除操作后会变得分散。

  3. 插入、更新和删除操作会创建未使用的数据块。

注意事项: 不同的数据库可能会以不同的方式处理此问题:例如,在SQLite中, 如果使用未别名化的rowid,VACUUM命令将重置rowid值。 但如果使用INTEGER PRIMARY KEY列,则VACUUM不会更改该列的值。

Vacuum需要空间来复制数据库并运行操作。


2
“vacuumdb” 在 MySQL,sqlite 和 PostgreSQL 中都有出现。在 PostgreSQL 中,“vacuumdb” 用于识别已删除行所占用的空间,并将其目录化以供将来使用。“vacuum full” 进行更全面的检查,并将记录移动到新创建的空间中。

-2

这很类似于对文件系统进行碎片整理。有关PGSQL文档的更多信息。


10
磁盘碎片整理并不是为了回收空间,而是为了重新排列数据以减少碎片化。 - edgar.holleis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接