正如这个Firefox漏洞所提到的,清理数据库的操作是什么意思?所有现代数据库软件都支持这个操作吗,还是只有某些软件支持?
使用多版本并发控制(MVCC)隔离每个事务的数据库需要定期扫描表以删除过时的行副本。在MVCC中,当更新或删除一行时,不能立即回收该行,因为可能仍有活动事务可以看到该行的旧版本。为了避免检查这种情况,这些旧行被认为仍然相关。回收空间的过程推迟到表被清理之前进行,具体取决于数据库,可以自动或显式地启动。
清理(Vacuum)指的是两件事情:
为什么要使用Vacuum:
当您删除数据库对象(如表、视图、索引和触发器)或从表中删除数据时,数据库文件的大小始终会增长。因为SQLite只是将已删除的对象标记为空闲,并保留其供将来使用。
索引和表在进行大量插入、更新和删除操作后会变得分散。
插入、更新和删除操作会创建未使用的数据块。
注意事项: 不同的数据库可能会以不同的方式处理此问题:例如,在SQLite中, 如果使用未别名化的rowid,VACUUM命令将重置rowid值。 但如果使用INTEGER PRIMARY KEY列,则VACUUM不会更改该列的值。
Vacuum需要空间来复制数据库并运行操作。