2014年3月1日 星期六

壓縮SQLite的資料檔案

參考引用來源:壓縮SQLite的資料檔案
--
在使用SQLite資料庫時,發現程式執行刪除操作時,資料庫檔大小並沒有減小。查了相關資料後發現,當從 SQLite 刪除資料之後,未使用的磁碟空間被添加到一個內在的“空閒清單”中用於存儲你下次插入的資料。磁碟空間並沒有丟失,但是也不向作業系統返回磁碟空間。 如果想要減小資料庫檔,可以設置auto_vacuum標記,當開啟auto_vacuum,提交一個從資料庫中刪除資料的事務時,資料庫檔自動收縮。需要注意的是只有在資料庫未創建任何表時才能改變auto_vacuum標記。
在創建資料庫後首先執行以下語句,即可設置auto_vacuum標記。
m_db.execDML(_T("PRAGMA auto_vacuum = 1"));//(m_db為CppSQLite3DB物件)



還有另一種方法是執行vacuum命令


即時的插入和刪除會使得資料庫檔結構混亂,減慢對資料庫內容訪問的速度。 VACUUM命令複製主要資料庫檔到臨時資料庫並從臨時資料庫重新載入主要資料庫,以整理資料庫檔。這將除去空白頁,使表資料彼此相鄰排列,並整理資料庫檔結構。


代碼示例:


CString strSql = _T("VACUUM;");
m_db.execQuery(strSql);// (m_db為CppSQLite3DB物件)


兩個方法的區別在於:使用auto_vacuum僅僅是將空閒的頁除去,並不會像VACUUM那樣對資料庫進行磁碟重組,或是壓縮資料庫頁。


示例比較表:單位(位元組)


初始資料庫大小 插入5000條資料後 刪除所有資料


未做任何處理 7168 250880 250880


auto_vacuum標記 8192 252928 8192


執行vacuum命令 7168 250880 7167


備註:設置auto_vacuum標記後,資料庫會在內部存儲一些資訊以便支援這一功能,這使得資料庫檔比不開啟該選項時稍微大一些。

沒有留言:

張貼留言