壓縮Sqlite數據文件大小,解決數據刪除后占用空間不變的問題


最近有一網站使用Sqlite數據庫作為數據臨時性的緩存,對多片區進行划分 Sqlite數據庫文件,每天大概新增近1萬的數據量,起初效率有明顯的提高,但歷經一個多月后數據庫文件從幾K也上升到了近160M,數據量也達到了 40多萬條,平均每一條數據占用了 4K的空間,雖然使用上的效率直觀上沒有造成太大的影響,但服務器的占用內存卻比原來多占用了20%左右。今天剛好打算清除一個Sqlite的冗余數據, 將保留最近10天的數據就可以了,結果執行了刪除指令delete后刪除30多萬條數據保留了10多萬數據,卻發現Sqlite數據庫文件占用空間的大小 一點沒有少,這是為什么呢?


原因是:

當你從Sqlite刪除數據后,未使用的磁盤空間被添加到一個內在的空閑列表中用於存儲你下次插入的數據。磁盤空間並沒有丟失。但是也不向操作系統返回磁盤空間。(嘿嘿,Sqlite.orgFAQ中提到過這個問題)

 

解決方法:兩種

一,在數據刪除后,手動執行VACUUM命令,執行方式很簡單

 

objSQLHelper.ExecuteNonQuery(CommandType.Text, "VACUUM")

 

VACUUM命令會清空“空閑列表”,把數據庫尺寸壓縮到最小。但是要耗費一些時間。

FQA里面說,在Linux的環境下,大約0.5秒/M。並且要使用兩倍於數據庫文件的空間。

我憎恨此FQA,他只說系統環境,不說機器硬件環境。我在測試手機上執行用了將近13秒時間壓縮了將近3M的空間。至於它所占用的另一部分空間,是生成了一個.db-journal后綴名的臨時文件。(這個問題對我現在來說是無所謂的。)


使用Navicat for Sqlite也是非常簡單的,如下圖所示:

打開命令界面,手工輸入 VACUUM;

回車即可;


二,在數據庫文件建成中,將auto_vacuum設置成“1”。

注意:只有在數據庫中未建任何表時才能改變auto-vacuum標記。試圖在已有表的情況下修改不會導致報錯。

cmd.CommandText = "PRAGMA auto_vacuum = 1;"

cmd.ExecuteNonQuery()

當開啟auto-vacuum,當提交一個從數據庫中刪除除數據的事物時,數據庫文件自動收縮。

數據庫會在內部存儲一些信息以便支持這一功能,這使得數據庫文件比不開啟該選項時稍微大一些。

我的表結構,不含任何數據是,數據庫文件大小是25K左右,開了auto_vacuum之后是26K。

插入運行基礎數據后,文件變成35K,開了auto_vacuum之后是36K。

變化不大,無所謂。

 

推薦使用第一種方式手動執行VACUUM命令,去壓縮Sqlite數據庫文件的大小。 其實最近有一項目廣州免費招標網 正是使用該方式去清除Sqlite數據庫文件。

 

參考文章:

壓縮Sqlite數據文件大小,解決數據刪除后占用空間不變的問題

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM