Android中SQLite开发详解(三)如何压缩SQLite的数据文件

进行移动设备开发,例如Windows Mobile或者Wince(Windows Embedded CE)的开发,有时候会使用到SQLite作为存储数据库。SQLite默认配置是不会自动回收空间,如何进行大量数据的删除以后,数据库文件大小不会自动减少,因此需要手工压缩SQLite的数据文件大小。

导致原因:数据库实时的插入和删除会使得数据库文件结构混乱,数据库访问速度减慢。当数据库中的表,索引或触发器被撤销,会留下空白磁盘空间。使数据库比需要的大小更大,但能加快INSERT插入速度。

解决方法:调用一下SQL命令即可:

VACUUM

VACUUM命令工作原理:复制当前数据库文件到临时数据库并从临时数据库重新载入主数据库,以整理数据库文件。这将除去空白页,使表数据彼此相邻排列,并整理数据库文件结构。

VACUUM命令不会改变表中记录的ROWID值,即不对表的ROWID值从1开始重新分配。这点非常重要!

SQLite3.1中,可以通过使用auto-vacuum模式取代VACUUM命令,使用 auto_vacuum pragma开启该模式。

1、auto-vacuum标记的含义:
正常情况下,当提交一个从数据库中删除数据的事务时,数据库文件不改变大小。未使用的文件页被标记并在以后的添加操作中再次使用。这种情况下使用VACUUM命令释放删除得到的空间。但是Vacuum的效率非常低!

如何设置:


PRAGMA auto_vacuum = 0 | 1;


当开启auto-vacuum,也就是执行pragma auto_vacuum=1;


当提交一个从数据库中删除数据的事务时,数据库文件自动收缩, (VACUUM命令在auto-vacuum开启的数据库中不起作用)。数据库会在内部存储一些信息以便支持这一功能,这使得 数据库文件比不开启该选项时稍微大一些。


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


5.建议:


不要打开。也就是“PRAGMA auto_vacuum = 0;”执行命令。

注:对于SQLite3.1,可以使用“auto-vacuum模式”代替“VACUUM命令”在删除数据后回收空间,可以通过使用auto_vacuum编译指示来使能auto-vacuum模式。使能auto_vacuum模式之后,一个数据库在删除数据后留下的空闲页就可能会被回收,从而缩小数据库文件,而不用使用VACUUM命令重新构建整个数据库。然而,使用auto_vacuum模式将会导致额外的数据库文件碎片。并且使用auto_vacuum模式不会压缩部分数据库的填充页而VACUUM命令则会(压缩)。

===============================================================================================================

The VACUUM command rebuilds the entire database. There are several reasons an application might do this:

1. Unless SQLite is running in “auto_vacuum=FULL” mode, when a large amount of data is deleted from the database file it leaves behind empty space, or “free” database pages. This means the database file might be larger than strictly necessary. Running VACUUM to rebuild the database reclaims this space and reduces the size of the database file.

(译文:除非SQLite运行在“auto_vacuum=FULL”模式,否则当从数据库文件中删除大量数据之后,就会留下很多空白空间,或者“空闲”的数据库页。这意味着数据库文件的大小会比(它所存储的数据)实际需要的(空间)更大。运行VACUUM命令将会重新构建数据库文件,回收空白空间,减小数据库文件的大小。)

2. Frequent inserts, updates, and deletes can cause the database file to become fragmented – where data for a single table or index is scattered around the database file. Running VACUUM ensures that each table and index is largely stored contiguously within the database file. In some cases, VACUUM may also reduce the number of partially filled pages in the database, reducing the size of the database file further.

(译文:频繁的插入,更新和删除操作,会导致数据库文件变得支离破碎(产生大量的内存碎片)——因为单独一个表中的数据或者索引可能会分散的存储在数据库文件中。运行VACUUM命令可以确保每个表(的数据)和索引可以最大限度的连续存储在数据库文件中。在某些情况下,VACUUM命令也会减少数据库中的一部分填充页面,从而进一步减小数据库文件的大小。)

3. Normally, the database page_size and whether or not the database supports auto_vacuum must be configured before the database file is actually created. However, when not in write-ahead log mode, the page_size and/or auto_vacuum properties of an existing database may be changed by using the page_size and/or pragma auto_vacuum pragmas and then immediately VACUUMing the database. When in write-ahead log mode, only the auto_vacuum support property can be changed using VACUUM.

(译文:通常情况下,数据库的page_size和数据库是否支持auto_vacuum(这些配置)都要在数据库文件实际创建之前进行配置。然而,如果SQLite不是运行在“写前日志(write-ahead log)”模式下,一个已经存在(已经创建)的数据库(文件)的page_size和/或auto_vacuum属性,可以使用page_size和/或auto_vacuum编译指示进行修改,然后立即清扫数据库。如果SQLite是运行在“写前日志”模式下,则只有(是否支持)auto_vacuum属性可以通过VACUUM命令进行修改。)

VACUUM only works on the main database. It is not possible to VACUUM an attached database file.

(译文:VACUUM命令只能工作在主数据库上,不能用来“清扫”一个附加的数据库文件。)

The VACUUM command works by copying the contents of the database into a temporary database file and then overwriting the original with the contents of the temporary file. When overwriting the original, a rollback journal or write-ahead log WAL file is used just as it would be for any other database transaction. This means that when VACUUMing a database, as much as twice the size of the original database file is required in free disk space.

(译文:VACUUM命令通过如下方式进行工作:首先把数据库内容复制到一个临时数据库文件中,然后再把临时数据库文件中的内容写回到原始数据库文件中(以整理数据库文件)。当将内容重新写回到原始数据库文件时,一个回滚日志或者写前日志WAL文件将会被使用,正如它为其它数据库事务服务一样。这意味着当“清扫”一个数据库时,将需要使用高达两倍于原始数据库文件大小的空闲磁盘空间。)

The VACUUM command may change the ROWIDs of entries in any tables that do not have an explicit INTEGER PRIMARY KEY.

(译文:VACUUM命令可能会改变数据库表的行ID(ROWIDs),假如这个表没有一个显示的整形主键(INTEGER PRIMARY KEY)的话。)

A VACUUM will fail if there is an open transaction, or if there are one or more active SQL statements when it is run.

(译文:如果存在一个打开(open)的事务,或者存在一个或多个正在活动(活跃)的(active)SQL语句,那么VACUUM命令将会执行失败。)

As of SQLite version 3.1, an alternative to using the VACUUM command to reclaim space after data has been deleted is auto-vacuum mode, enabled using the auto_vacuum pragma. When auto_vacuum is enabled for a database free pages may be reclaimed after deleting data, causing the file to shrink, without rebuilding the entire database using VACUUM. However, using auto_vacuum can lead to extra database file fragmentation. And auto_vacuum does not compact partially filled pages of the database as VACUUM does.

(译文:对于SQLite3.1,可以使用“auto-vacuum模式”代替“VACUUM命令”在删除数据后回收空间,可以通过使用auto_vacuum编译指示来使能auto-vacuum模式。使能auto_vacuum模式之后,一个数据库在删除数据后留下的空闲页就可能会被回收,从而缩小数据库文件,而不用使用VACUUM命令重新构建整个数据库。然而,使用auto_vacuum模式将会导致额外的数据库文件碎片。并且使用auto_vacuum模式不会压缩部分数据库的填充页而VACUUM命令则会(压缩)。)

上面的内容来自SQLite官网:http://www.sqlite.org/lang_vacuum.html,下面做些补充:

(1)

VACUUM命令是SQLite的一个扩展功能,模仿PostgreSQL中的相同命令而来。在SQLite早期版本中,若调用VACUUM带一个表名或索引名,则将整理该表或索引。后来VACUUM被重新实现,索引名或表名被忽略。

当数据库中的一个对象(表,索引或触发器)被撤销,会留下空白的空间。它使数据库比需要的大小更大,但能加快插入速度。实时的插入和删除会使得数据库文件结构混乱,减慢对数据库内容访问的速度。VACUUM命令复制主数据库文件到临时数据库并从临时数据库重新载入到主数据库,以整理数据库文件。这将除去空白页,使表数据彼此相邻排列,并整理数据库文件结构。不能对附加数据库文件进行以上操作。

若当前有活动事务,该命令无法起作用。对于in-memory数据库,该命令无效。在SQLite3.1中,可以通过使用auto-vacuum模式作为VACUUM命令的一个替代,使用 auto_vacuum pragma开启该模式。

(2)

使用VACUUM命令可以在删除数据后使数据库文件减小,在SQLIte3以后有一个替代的办法是使用PRAGMA auto_vacuum。

查询或设置数据库的auto-vacuum标记。

正常情况下,当提交一个从数据库中删除数据的事务时,数据库文件不改变大小。未使用的文件页被标记并在以后的添加操作中再次使用。这种情况下使用VACUUM命令释放删除后留下的空白空间。

当开启auto-vacuum,并提交一个从数据库中删除数据的事务时,数据库文件自动收缩,(VACUUM命令在auto-vacuum开启的数据库中不起作用)。数据库会在内部存储一些信息以便支持这一功能,这使得数据库文件比不开启该选项时稍微大一些。

另外,“auto-vacuuming must be turned on before any tables are created. It is not possible to enable or disable auto-vacuum after a table has been created”。大概意思是,当有表创建后就不能对auto-vacuum进行更改。

使用auto_vacuum仅仅是将空闲的页除去,并不会像VACUUM那样对数据库进行碎片整理,或是压缩数据库页。使用auto_vacuum会造成而额外的文件碎片。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值