当使用 INSERT、UPDATE 或 DELETE 语句时,SQLite 数据库文件的大小会增加并变得碎片化。 DELETE 语句会导致未返回给操作系统的空白空间。而 INSERT 和 UPDATE 语句会导致数据分散在数据库文件中。

VACUUM 命令用于通过删除过时的数据并减小数据库文件的大小来回收存储。它通过将所有表的完整内容写入新的数据库文件来实现此目的。此过程释放所有未使用的空间,并确保所有表和索引连续存储。

VACUUM 命令可能会更改没有显式 INTEGER PRIMARY KEY 的表中条目的 ROWID。 VACUUM 命令仅适用于主数据库。无法 VACUUM 附加的数据库文件。

如果存在活动事务,VACUUM 命令将失败。 VACUUM 命令对于内存数据库来说是无操作的。由于 VACUUM 命令从头开始重建数据库文件,VACUUM 还可以用于修改许多特定于数据库的配置参数。

手动 VACUUM

为数据库发出 VACUUM 命令的语法命令提示符下的整个数据库如下:

$sqlite3 database_name 'VACUUM;' 

要从 SQLite 提示符运行 VACUUM 命令,可以使用以下语法:

sqlite> VACUUM; 

要在特定表上运行 VACUUM 命令,语法为:

sqlite> VACUUM table_name; 

示例

在 SQLite 中,清理过程是一项常规活动,必须执行该活动以最小化数据库文件的大小并确保数据和索引连续存储。

下面的命令将清理数据库中的所有表。由于所有未使用的空间都被回收回操作系统,数据库文件将被最小化。

sqlite> VACUUM; 

AUTO_VACUUM

AUTO_VACUUM 是一项可选功能,可自动清理数据库以最小化大小的数据库文件。默认情况下,AUTO_VACUUM 功能处于禁用状态。

注意:AUTO_VACUUM 的作用与 VACUUM 不同。尽管 AUTO_VACUUM 功能通过回收未使用的空间来减小数据库文件的大小,但它不会执行任何碎片整理。这意味着文件中的表和索引可能不是连续存储的。要对数据库文件进行碎片整理,应使用 VACUUM 语句。

要查看 AUTO_VACUUM 进程的当前模式,可以使用以下 PRAGMA 语句:

PRAGMA [database.]auto_vacuum;

或者

$sqlite3 database_name 'PRAGMA auto_vacuum;' 

上面的这条语句将返回 AUTO_VACUUM 进程的模式。请参阅下表了解 AUTO_VACUUM 模式。

要更改 AUTO_VACUUM 进程的当前模式,可以使用以下 PRAGMA 语句:

PRAGMA [database.]auto_vacuum = mode; 

模式决定 AUTO_VACUUM 进程如何进行会表现。它可以是以下值之一:

模式描述
0 或 NONE自动清理功能已禁用。这是默认模式,这意味着除非使用 VACUUM 命令手动清理数据库文件,否则数据库文件的大小永远不会缩小。
1 或 FULL自动清理已启用且全自动,这允许数据库文件在从数据库中删除数据时缩小。
2 或 INCRMENTAL自动清理已启用,但必须手动激活。在这种模式下,引用数据被保留,但空闲页面只是简单地放入空闲列表中。这些页面可以随时使用incremental_vacuum pragma恢复。

示例

下面的命令可用于启用 AUTO_VACUUM 进程自动处理所有清理工作。

PRAGMA auto_vacuum = 1;