壓縮Sqlite資料檔案大小,解決資料刪除後佔用空間不變的問題

來源:互聯網
上載者:User

標籤:

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


原因是:

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

 

解決方案:兩種

一,在資料刪除後,手動執行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資料檔案大小,解決資料刪除後佔用空間不變的問題

 

壓縮Sqlite資料檔案大小,解決資料刪除後佔用空間不變的問題

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.