SQLite入门与分析(九)---VACUUM命令分析

前端之家收集整理的这篇文章主要介绍了SQLite入门与分析(九)---VACUUM命令分析前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
VACUUM命令是sqlite的一个扩展功能,模仿Postgresql中的相同命令而来。若调用VACUUM带一个表名或索引名, 则将整理该表或索引。在sqlite 1.0中,VACUUM命令调用 gdbm_reorganize()整理后端数据库文件

sqlITE 2.0.0中去掉了GDBM后端,VACUUM无效。在2.8.1版中,VACUUM被重新实现。现在索引名或表名被忽略。

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

若当前有活动事务,该命令无法起作用。对于in-memory数据库,该命令无效。

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

VACUUM的使用:VACUUM main
当对3.4节中讨论的数据进行VACUUM操作后,页面只剩第一个页面

VACUUM实现:


代码实现(vcuum.c):
intsqlite3RunVacuum(char**pzErrMsg,sqlite3*db){
///////////////////////////////////第1步////////////////////////////////////////////////
zsql=sqlite3MPrintf("ATTACH'%q'ASvacuum_db;",zTemp);
//创建临时数据库vacuum_db
rc=execsql(db,zsql);
//第2步////////////////////////////////////////////////
开始一个事务BEGINEXCLUSIVE;");
//第3步在vacuum_db中建立main数据库的所有表,索引和视图,并将main中的所有表,索引和视图的数据插入
到vacuum_db。即在vacuum_db建立main的镜象。
rc=execExecsql(db,
SELECT'CREATETABLEvacuum_db.'||substr(sql,14,100000000)"
FROMsqlite_masterWHEREtype='table'ANDname!='sqlite_sequence'");
if(rc!=sqlITE_OK)gotoend_of_vacuum;
rc
=execExecsql(db,0)">SELECT'CREATEINDEXvacuum_db.'||substr(sql,0)">FROMsqlite_masterWHEREsqlLIKE'CREATEINDEX%'SELECT'CREATEUNIQUEINDEXvacuum_db.'||substr(sql,21,0)">FROMsqlite_masterWHEREsqlLIKE'CREATEUNIQUEINDEX%'SELECT'CREATEVIEWvacuum_db.'||substr(sql,13,0)">FROMsqlite_masterWHEREtype='view'"
);
rc
=execExecsql(db,0)">SELECT'INSERTINTOvacuum_db.'||quote(name)||'SELECT*FROM'||quote(name)||';'FROMsqlite_masterWHEREtype='table'ANDname!='sqlite_sequence';"
);
//第4步////////////////////////////////////////////////
将vacumm_db数据库对应的数据文件的数据拷贝到main数据库对应的数据文件,一个页面一个页面的拷贝
rc=sqlite3BtreeCopyFile(pMain,pTemp);
//第5步提交事务
rc=sqlite3BtreeCommit(pTemp);
gotoend_of_vacuum;
rc
=sqlite3BtreeCommit(pMain); }

猜你在找的Sqlite相关文章