解決sqlite 刪除記錄後數據庫文件大小不變

 

最的作的項目中要有到sqlite數據存儲,寫了測試程序進行測試,存入300萬條記錄,佔用flash大小爲 86.1M,當把表中的記錄所有刪除後發後數據庫文件大小依然是 86.1M;

緣由是:
sqlite採用的是變長紀錄存儲,當你從Sqlite刪除數據後,未使用的磁盤空間被添加到一個內在的」空閒列表」中用於存儲你下次插入的數據,用於提升效率,磁盤空間並無丟失,但也不向操做系統返回磁盤空間,這就致使刪除數據乃至清空整個數據庫後,數據文件大小仍是沒有任何變化,仍是很大

解決方法:兩種html

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

sqlite> vacuum;數據庫

VACUUM命令會清空「空閒列表」,把數據庫尺寸壓縮到最小。可是要耗費一些時間。測試

FQA裏面說,在Linux的環境下,大約0.5秒/M。而且要使用兩倍於數據庫文件的空間。操作系統

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

二,在數據庫文件建成中,將auto_vacuum設置成「1」。sqlite

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

cmd.CommandText = "PRAGMA auto_vacuum = 1;"get

cmd.ExecuteNonQuery()cmd

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

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

個人表結構,不含任何數據是,數據庫文件大小是25K左右,開了auto_vacuum以後是26K。

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

變化不大,無所謂。

 

可是第二個方法一樣有缺點,只會從數據庫文件中截斷空閒列表中的頁, 而不會回收數據庫中的碎片,也不會像VACUUM 命令那樣從新整理數據庫內容。實際上,因爲須要在數據庫文件中移動頁, auto-vacuum 會產生更多的碎片。並且,在執行刪除操做的時候,也有那個.db-journal文件產生。

要使用auto-vacuum,須要一些前題條件。 數據庫中須要存儲一些額外的信息以記錄它所跟蹤的每一個數據庫頁都找回其指針位置。 因此,auto-vacumm 必須在建表以前就開啓。在一個表建立以後, 就不能再開啓或關閉 auto-vacumm。

 

其實按照運行時間上的比較,兩個在作了大刪除操做後,從3M變到35K的時間其實差很少,執行VACUUM命令稍微長一點,可是也長不了多少,相對而言,這種一點點的長能夠忽略不計。

加上AUTO的方式對碎片的形成狀況,若是數據交換次數多的話,這種方式很不合適。

相關文章
相關標籤/搜索