解决sqlite 删除记录后数据库文件大小不变

 

最的作的项目中要有到sqlite数据存储,写了测试程序进行测试,存入300万条记录,占用flash大小为 86.1M,当把表中的记录所有删除后发后数据库文件大小依然是 86.1M;

缘由是:
sqlite采用的是变长纪录存储,当你从Sqlite删除数据后,未使用的磁盘空间被添加到一个内在的”空闲列表”中用于存储你下次插入的数据,用于提升效率,磁盘空间并无丢失,但也不向操做系统返回磁盘空间,这就致使删除数据乃至清空整个数据库后,数据文件大小仍是没有任何变化,仍是很大

解决方法:两种html

一,在数据删除后,手动执行VACUUM命令,执行方式很简单sql

sqlite> vacuum;数据库

VACUUM命令会清空“空闲列表”,把数据库尺寸压缩到最小。可是要耗费一些时间。测试

FQA里面说,在Linux的环境下,大约0.5秒/M。而且要使用两倍于数据库文件的空间。操作系统

我憎恨此FQA,他只说系统环境,不说机器硬件环境。我在测试手机上执行用了将近13秒时间压缩了将近3M的空间。至于它所占用的另外一部分空间,是生成了一个.db-journal后缀名的临时文件。(这个问题对我如今来讲是无所谓的。)指针

二,在数据库文件建成中,将auto_vacuum设置成“1”。sqlite

注意:只有在数据库中未建任何表时才能改变auto-vacuum标记。试图在已有表的状况下修改不会致使报错。htm

cmd.CommandText = "PRAGMA auto_vacuum = 1;"get

cmd.ExecuteNonQuery()cmd

当开启auto-vacuum,当提交一个从数据库中删除除数据的事物时,数据库文件自动收缩。

数据库会在内部存储一些信息以便支持这一功能,这使得数据库文件比不开启该选项时稍微大一些。

个人表结构,不含任何数据是,数据库文件大小是25K左右,开了auto_vacuum以后是26K。

插入运行基础数据后,文件变成35K,开了auto_vacuum以后是36K。

变化不大,无所谓。

 

可是第二个方法一样有缺点,只会从数据库文件中截断空闲列表中的页, 而不会回收数据库中的碎片,也不会像VACUUM 命令那样从新整理数据库内容。实际上,因为须要在数据库文件中移动页, auto-vacuum 会产生更多的碎片。并且,在执行删除操做的时候,也有那个.db-journal文件产生。

要使用auto-vacuum,须要一些前题条件。 数据库中须要存储一些额外的信息以记录它所跟踪的每一个数据库页都找回其指针位置。 因此,auto-vacumm 必须在建表以前就开启。在一个表建立以后, 就不能再开启或关闭 auto-vacumm。

 

其实按照运行时间上的比较,两个在作了大删除操做后,从3M变到35K的时间其实差很少,执行VACUUM命令稍微长一点,可是也长不了多少,相对而言,这种一点点的长能够忽略不计。

加上AUTO的方式对碎片的形成状况,若是数据交换次数多的话,这种方式很不合适。

相关文章
相关标签/搜索