Sqlite3 / C ++在不更改db大小的情况下执行DELETE语句

时间:2012-02-10 14:35:24

标签: c++ sqlite sql-delete

怎么可能?我有一个简单的C ++应用程序,它使用SQLite3来INSERT / DELETE记录。 我在里面使用一个数据库和一个表。然后,在我选择将一些数据存储到数据库中之后,确实存在,并且my.db的大小自然会增加。

虽然DELETE存在问题 - 但事实并非如此。但如果我这样做:

sqlite3 my.db
sqlite> select count(*) from mytable;

返回0表示没问题,但如果对包含my.db的文件夹执行ls -l,则大小合适 是一样的。

任何人都可以解释一下吗?

2 个答案:

答案 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

相关问题