在线文档教程

VACUUM

SQL:SQLite可辨识的语言

【置顶】

VACUUM

vacuum-stmt: 隐藏

VACUUM 命令重建数据库文件,将其重新打包为最小量的磁盘空间。应用程序可能会这样做有几个原因:

  • 除非SQLite以 “auto_vacuum = FULL” 模式运行,否则当从数据库文件中删除大量数据时,它会留下空白空间或“空闲”数据库页面。这意味着数据库文件可能比绝对必要的文件大。运行 VACUUM 重建数据库将回收此空间并减小数据库文件的大小。

  • 经常插入、更新和删除可能导致数据库文件变为碎片——即单个表或索引的数据分散在数据库文件周围。运行 VACUUM 可确保每个表和索引大部分连续存储在数据库文件中。在某些情况下,VACUUM 也可能会减少数据库中部分填充页面的数量,进一步减小数据库文件的大小。

  • 通常,数据库 page_size 和数据库是否支持 auto_vacuum 必须在数据库文件实际创建之前进行配置。但是,如果不处于预写日志模式,则可以使用 page_size 和/或 pragma auto_vacuum 编译指示符更改现有数据库的 page_size 和/或 auto_vacuum 属性,然后立即对数据库执行 VACUUM 操作。处于预写日志模式时,只能使用 VACUUM 更改auto_vacuum 属性。

默认情况下,VACUUM 仅适用于主数据库。附加的数据库可以通过在 VACUUM 语句中附加相应的模式名称来清除。

兼容性警告:在版本3.15.0(2016-10-14)中添加了对数据库进行 vacuum 的功能。在此之前,添加到 VACUUM 语句的模式名将被默默忽略,并且 “main” 模式将被清空。

VACUUM 命令将数据库的内容复制到临时数据库文件中,然后用临时文件的内容覆盖原始文件。覆盖原始文件时,将使用回退日志或预写日志 WAL 文件,就像使用其他数据库事务一样。这意味着在对数据库进行 VACUUM 时,可用磁盘空间需要原始数据库文件大小的两倍。

VACUUM 命令可能会更改任何没有显式 INTEGER PRIMARY KEY 的表中的条目的 ROWID。

如果存在打开的事务,或者运行时有一个或多个活动的 SQL 语句,则 VACUUM 将运行失败。

在删除数据后使用 VACUUM 命令回收空间的另一种方法是使用 auto_vacuum 杂注启用的”自动吸尘模式“。当为数据库启用 auto_vacuum 时,可以在删除数据后收回页面,导致文件缩小,而无需使用 VACUUM 重建整个数据库。但是,使用 auto_vacuum 可能会导致额外的数据库文件碎片。并且 auto_vacuum 和 VACUUM 一样不会压缩部分填充的数据库页面。

SQLite is in the Public Domain.