SQLite Vacuum

VACUUM 命令经过复制主数据库中的内容到一个临时数据库文件,而后清空主数据库,并从副本中从新载入原始的数据库文件。这消除了空闲页,把表中的数据排列为连续的,另外会清理数据库文件结构。sql

若是表中没有明确的整型主键(INTEGER PRIMARY KEY),VACUUM 命令可能会改变表中条目的行 ID(ROWID)。VACUUM 命令只适用于主数据库,附加的数据库文件是不可能使用 VACUUM 命令。数据库

若是有一个活动的事务,VACUUM 命令就会失败。VACUUM 命令是一个用于内存数据库的任何操做。因为 VACUUM 命令从头开始从新建立数据库文件,因此 VACUUM 也能够用于修改许多数据库特定的配置参数。spa

手动 VACUUM

下面是在命令提示符中对整个数据库发出 VACUUM 命令的语法:操作系统

$sqlite3 database_name "VACUUM;"

您也能够在 SQLite 提示符中运行 VACUUM,以下所示:sqlite

sqlite> VACUUM;

您也能够在特定的表上运行 VACUUM,以下所示:事务

sqlite> VACUUM table_name;

自动 VACCUM(Auto-VACUUM)

SQLite 的 Auto-VACUUM 与 VACUUM 不大同样,它只是把空闲页移到数据库末尾,从而减少数据库大小。经过这样作,它能够明显地把数据库碎片化,而 VACUUM 则是反碎片化。因此 Auto-VACUUM 只会让数据库更小。内存

在 SQLite 提示符中,您能够经过下面的编译运行,启用/禁用 SQLite 的 Auto-VACUUM:开发

sqlite> PRAGMA auto_vacuum = NONE; -- 0 means disable auto vacuum sqlite> PRAGMA auto_vacuum = INCREMENTAL; -- 1 means enable incremental vacuum sqlite> PRAGMA auto_vacuum = FULL; -- 2 means enable full auto vacuum

您能够从命令提示符中运行下面的命令来检查 auto-vacuum 设置:rem

$sqlite3 database_name "PRAGMA auto_vacuum;"在数据库中删除了不少数据,但数据库文件没有变小,是Bug吗?不是。当你从SQLite数据库中删除数据时, 未用的磁盘空间将会加入一个内部的“自由列表”中。 当你下次插入数据时,这部分空间能够重用。磁盘空间不会丢失, 但也不会返还给操做系统。若是删除了大量数据,而又想缩小数据库文件占用的空间,执行 VACUUM 命令。 VACUUM 将会从头从新组织数据库。这将会使用数据库有一个空的“自由链表”, 数据库文件也会最小。但要注意的是,VACUUM 的执行会须要一些时间 (在SQLite开发时,在Linux上,大约每M字节须要半秒种),而且, 执行过程当中须要原数据库文件至多两倍的临时磁盘空间。
相关文章
相关标签/搜索