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

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

解决方法:两种
一,在数据删除后,手动执行VACUUM命令,执行方式很简单

sqlite> vacuum;

VACUUM命令会清空“空闲列表”,把数据库尺寸压缩到最小。但是要耗费一些时间。
FQA里面说,在Linux的环境下,大约0.5秒/M。并且要使用两倍于数据库文件的空间。
我憎恨此FQA,他只说系统环境,不说机器硬件环境。我在测试手机上执行用了将近13秒时间压缩了将近3M的空间。至于它所占用的另一部分空间,是生成了一个.db-journal后缀名的临时文件。(这个问题对我现在来说是无所谓的。)
二,在数据库文件建成中,将auto_vacuum设置成“1”。
注意:只有在数据库中未建任何表时才能改变auto-vacuum标记。试图在已有表的情况下修改不会导致报错。

cmd.CommandText = "PRAGMA auto_vacuum = 1;"
cmd.ExecuteNonQuery()

当开启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的方式对碎片的造成情况,如果数据交换次数多的话,这种方式很不合适。

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

  1. mysql查询数据不变_mysql之delete删除记录后数据库大小不变

    当DELETE后面跟条件的时候,则就会出现这个问题 delete from table_name where 条件 删除数据后,数据表占用的空间大小不会变. 不跟条件直接delete的时候. dele ...

  2. mysql之delete删除记录后数据库大小不变

    当DELETE后面跟条件的时候,则就会出现这个问题 delete from table_name where 条件 删除数据后,数据表占用的空间大小不会变. 不跟条件直接delete的时候. dele ...

  3. clientdataset 遍历字段_解决DBGridEh遍历记录后不移动当前行位置的方法

    解决DBGridEh遍历记录后不移动当前行位置的方法 在用DBGridEh配合ClientDataSet使用时,需要知道用户选择了哪些记录,可用遍历记录的方法查询选择列是否为真,但在这之后,Clien ...

  4. 数据库的主键ID设置为自动增加,删除记录后的记录还是递增的,如何重新从1开始增加呢?

    操作 数据库数据 删除了7和8之后添加了一条新数据 问题 删除记录后的记录还是递增的,如何重新从1开始增加呢? 解决 truncate table 表名; 注意 此语句会把表中数据清空

  5. 解决word删除mathtype后PPT里不停弹出关于mathtype的错误信息的问题

    解决word删除mathtype后PPT里不停弹出关于mathtype的错误信息的问题 问题 解决 问题 自己安装的mathtype在加入word加载项后却无法正常使用,将mathtype从word加 ...

  6. 解决linux删除文件后空间没有释放问题

    为什么80%的码农都做不了架构师?>>>    inux删除文件后沒有释放空间 今天发现一台服务器的home空间满了,于是要清空没用的文件,当我删除文件后,发现可用空间沒有变化 os ...

  7. 解决Mac删除lantern后依然残留图标问题

    lantern卸载之后应用程序界面依然残留图标,试了很多方法,下面这个最方便,而且成功删掉了所有的残留.Mark一下 (需要把TeamViewer改成Lantern) 解决MAC删除应用程序后依然残留 ...

  8. 行车记录仪的记录怎么删除?删除记录后还能恢复吗?

    行车记录仪的记录怎么删除?行车记录仪如今是每个车主的必备工具,它能记录车辆行驶途中的影像以及声音,可为交通事故提供证据,碰到专业碰瓷和拦路抢劫的的情况,行车记录仪可以提供破案的决定性证据:如事故发生现 ...

  9. mysql删除记录后id不连续_Mysql数据库中使用DELETE语句时,一般删除一条记录后ID会不连续,才能让序号继续按顺序排列?...

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

最新文章

  1. 安卓安装完应用后,如何获取包的meta-inf目录下的文件?
  2. Linux的概念与体系 2. Linux文件管理(转载)
  3. python requirements.txt_python生成requirements.txt的两种方法
  4. Tensorflow【实战Google深度学习框架】基于tensorflow + Vgg16进行图像分类识别
  5. spring.profiles.active配置了没生效_一文带你彻底学会 Git Hooks 配置
  6. BOM的window对象的属性及其方法
  7. Multilink ppp多链接PPP协议的配置
  8. Hive 热门数据分析面试题解析
  9. # 解析bt文件_BT、磁力链这些词语是什么意思?
  10. 简单程序所需要的简单 asp.net通用数据库访问类
  11. 易语言超文本ctrl c,易语言超文本浏览框处理键盘消息源码
  12. 设置Kafka集群的方法
  13. Java注释以及快捷键
  14. 免费Cron表达式生成器源码
  15. 用Python寻找最优投资组合
  16. 云南省计算机考研排名,考研云南有哪些大学排名
  17. Vue-router:二级路由跳转另一条路由下的子级
  18. 中国植物绝缘油变压器行业研究与投资前景报告(2022版)
  19. RC高通滤波电路详解
  20. Unity3d 官方角色换装Demo源代码学习

热门文章

  1. sed基本用法介绍1
  2. 如何打开远程桌面的任务管理器
  3. [解锁新姿势] 兄dei,你代码需要优化了
  4. 有哪些适合学生党入门级蓝牙耳机?平价入门级蓝牙耳机推荐
  5. 少走弯路的十条忠告-http://www.cnblogs.com/xdp-gacl/p/3952405.html孤傲苍狼的博客
  6. python土味情话_Python微信机器人,聊天、撩妹、提醒,垃圾分类,它样样精通
  7. PHP实现获取第一个中文首字母并进行排序的方法
  8. python期中考试试卷分析_期中考试试卷分析及工作总结
  9. Open with Live Server 无法打开浏览器
  10. P1331 海战 (搜索 广度优先搜索,BFS深度优先搜索,DFS)