加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-12 20:39:06 所属栏目:百科 来源:网络整理
导读:VACUUM命令是SQLite的一个扩展功能,模仿PostgreSQL中的相同命令而来。若调用VACUUM带一个表名或索引名, 则将整理该表或索引。在SQLite 1.0中,VACUUM命令调用 gdbm_reorganize()整理后端数据库文件。 SQLITE 2.0.0中去掉了GDBM后端,VACUUM无效。在2.8.1版
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); }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读