为什么在删除数据库中的大量数据后,SQLite 会将未使用的磁盘空间添加到“空闲列表”中?

syn*_*gma 3 sqlite disk-space

SQLite 常见问题说明如下:

(12) 我删除了很多数据,但数据库文件并没有变小。这是一个错误吗?

不会。当您从 SQLite 数据库中删除信息时,未使用的磁盘空间会添加到内部“空闲列表”中,并在您下次插入数据时重新使用。磁盘空间不会丢失。但它也不会返回到操作系统。

您能否向我解释该决定背后的动机(与立即将可用空间返回给操作系统相反)?这种决定(包括不明显的)的利弊是什么?

CL.*_*CL. 5

正如 Phil 所写,从空闲列表中释放页面需要移动页面(并且调整对这些页面的所有引用)。

当数据被删除时,很可能会在之后插入一些其他数据,然后这些数据就可以使用空闲列表中的页面。将这些页面返回给操作系统只是为了在之后分配新页面效率低下,并且会增加碎片(磁盘上的数据库文件和数据库文件中的对象)。但是如果你真的想让 SQLite 做到这一点,你可以使用PRAGMA auto_vacuum.

在实际操作中,通常不会发生大量删除数据的情况,如果您知道删除后不会插入新数据,则可以VACUUM手动运行该命令。