怎么可能?我有一个简单的C ++应用程序,它使用SQLite3来INSERT / DELETE记录。 我在里面使用一个数据库和一个表。然后,在我选择将一些数据存储到数据库中之后,确实存在,并且my.db的大小自然会增加。
虽然DELETE存在问题 - 但事实并非如此。但如果我这样做:
sqlite3 my.db
sqlite> select count(*) from mytable;
返回0表示没问题,但如果对包含my.db的文件夹执行ls -l
,则大小合适
是一样的。
任何人都可以解释一下吗?
答案 0 :(得分:4)
该方案列在SQLite Frequently Asked Questions:
中(12)我删除了很多数据,但数据库文件没有得到任何数据 小。这是一个错误吗?
没有。当您从SQLite数据库中删除信息时,未使用的磁盘空间将添加到内部"空闲列表"并被重用 下次插入数据时。磁盘空间不会丢失。但是都不是 它是否返回到操作系统。
如果删除大量数据并想缩小数据库文件,请运行
VACUUM
命令。VACUUM
将从中重建数据库 刮。这将使数据库具有空的空闲列表和a 文件最小的。但请注意,VACUUM
可以采用 运行一段时间(在Linux机器上每兆字节大约半秒钟 在哪里开发SQLite)它可以使用多达两倍 临时磁盘空间作为原始文件运行时。从SQLite 3.1版开始,使用
VACUUM
命令的替代方法是自动真空模式,使用auto_vacuum pragma启用。
文档是你的朋友; 请使用它。
同样来自the documentation:
在数据库中删除信息时,btree页面变为 为空,它不会从数据库文件中删除,而是被标记 as' free'供将来使用。当需要新页面时,SQLite将使用 在增加数据库大小之前,这些免费页面之一。这个 导致数据库碎片,文件大小增加 超出存储其数据所需的大小,以及数据本身 在文件中变得混乱。
动态数据库的另一个副作用是表碎片。该 包含单个表数据的页面可以传播 在数据库文件上,需要更长时间才能加载。这个可以 由于文件系统行为,数据库速度明显变慢。 压缩修复了这两个问题。
删除空页面的最简单方法是使用SQLite命令 真空。这可以在SQLite库调用中完成 sqlite实用程序。
深入的例子如下。
答案 1 :(得分:4)
执行DELETE查询时,Sqlite实际上不会删除记录并重新排列数据。这将花费太多时间。相反,它只是标记已删除的记录,并从那时起忽略它们。
如果您确实想减小数据大小,请执行VACUUM命令。还有一个自动吸尘选项。请参阅http://www.sqlite.org/lang_vacuum.html。