SQLite入门与分析(九)VACUUM命令分析
VACUUM命令是SQLite的一個擴展功能,模仿PostgreSQL中的相同命令而來。若調用VACUUM帶一個表名或索引名, 則將整理該表或索引。在SQLite 1.0中,VACUUM命令調用 gdbm_reorganize()整理后端數據庫文件。
SQLITE 2.0.0中去掉了GDBM后端,VACUUM無效。在2.8.1版中,VACUUM被重新實現?,F在索引名或表名被忽略。
當數據庫中的一個對象(表,索引或觸發器)被撤銷,會留下空白的空間。它使數據庫比需要的大小更大,但能加快插入速度。實時的插入和刪除會使得數據庫文件結構混亂,減慢對數據庫內容訪問的速度。 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步////////////////////////////////////////////////
//開始一個事務
rc=execSql(db,"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,
"SELECT'CREATEINDEXvacuum_db.'||substr(sql,14,100000000)"
"FROMsqlite_masterWHEREsqlLIKE'CREATEINDEX%'");
if(rc!=SQLITE_OK)gotoend_of_vacuum;
rc=execExecSql(db,
"SELECT'CREATEUNIQUEINDEXvacuum_db.'||substr(sql,21,100000000)"
"FROMsqlite_masterWHEREsqlLIKE'CREATEUNIQUEINDEX%'");
if(rc!=SQLITE_OK)gotoend_of_vacuum;
rc=execExecSql(db,
"SELECT'CREATEVIEWvacuum_db.'||substr(sql,13,100000000)"
"FROMsqlite_masterWHEREtype='view'"
);
rc=execExecSql(db,
"SELECT'INSERTINTOvacuum_db.'||quote(name)"
"||'SELECT*FROM'||quote(name)||';'"
"FROMsqlite_master"
"WHEREtype='table'ANDname!='sqlite_sequence';"
);
///////////////////////////////////第4步////////////////////////////////////////////////
//將vacumm_db數據庫對應的數據文件的數據拷貝到main數據庫對應的數據文件,一個頁面一個頁面的拷貝
rc=sqlite3BtreeCopyFile(pMain,pTemp);
///////////////////////////////////第5步////////////////////////////////////////////////
//提交事務
rc=sqlite3BtreeCommit(pTemp);
if(rc!=SQLITE_OK)gotoend_of_vacuum;
rc=sqlite3BtreeCommit(pMain);
}
總結
以上是生活随笔為你收集整理的SQLite入门与分析(九)VACUUM命令分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Sqlserver 数据库安全
- 下一篇: 贝塞尔曲线(UIBezierPath)属