日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

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

發布時間:2023/12/31 综合教程 48 生活家
生活随笔 收集整理的這篇文章主要介紹了 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命令分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。