解決sqlite 刪除記錄後資料庫檔案大小不變

2021-08-13 02:47:28 字數 1424 閱讀 7864

最的做的專案中要有到sqlite資料儲存,寫了測試程式進行測試,存入300萬條記錄,占用flash大小為 86.1m,當把表中的記錄全部刪除後發後資料庫檔案大小依然是 86.1m;

原因是:

sqlite採用的是變長紀錄儲存,當你從sqlite刪除資料後,未使用的磁碟空間被新增到乙個內在的」空閒列表」中用於儲存你下次插入的資料,用於提 高效率,磁碟空間並沒有丟失,但也不向作業系統返回磁碟空間,這就導致刪除資料乃至清空整個資料庫後,資料檔案大小還是沒有任何變化,還是很大

解決方法:兩種

一,在資料刪除後,手動執行vacuum命令,執行方式很簡單

sqlite> vacuum;
vacuum命令會清空「空閒列表」,把資料庫尺寸壓縮到最小。但是要耗費一些時間。

fqa裡面說,在linux的環境下,大約0.5秒/m。並且要使用兩倍於資料庫檔案的空間。

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

二,在資料庫檔案建成中,將auto_vacuum設定成「1」。

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

cmd.commandtext = "pragma auto_vacuum = 1;"

cmd.executenonquery()

當開啟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的方式對碎片的造成情況,如果資料交換次數多的話,這種方式很不合適。

Sqlite資料庫刪除大量資料後的擦屁股工作

sqlce 實在是太慢了,在執行速率和 sqlite 沒法比。所以在專案的下乙個版本中,準備用 sqlite 替換掉sqlce。事前做嘗試工作,畢竟沒有用過 sqlite。結果試了試確實不錯,有兩點很滿意。第一,執行速率就不用說了,眾所周一的比 sqlce快 第二,或許對別人來說是個雞肋,但是我這個...

SQLite刪除資料占用空間不變的解決方法

這幾天使用sqlite發現個問題,原空資料庫只有10k,往資料庫寫1m的資料,寫完資料之後,資料庫房有將近1034k左右,這時再將資料清空,發現資料庫的大小依然沒變,還是1034,我就奇了怪了,朋友告訴我應該是vacuum的原因,網上了查了下,網上的解釋如下 當你從sqlite刪除資料後,未使用的磁...

行車記錄儀的記錄怎麼刪除?刪除記錄後還能恢復嗎?

行車記錄儀的記錄怎麼刪除?行車記錄儀如今是每個車主的必備工具,它能記錄車輛行駛途中的影像以及聲音,可為交通事故提供證據,碰到專業碰瓷和攔路搶劫的的情況,行車記錄儀可以提供破案的決定性證據 如事故發生現場和案犯的體貌特徵等。還有一般行車記錄儀的記憶體都有限,那麼如何定期清理行車記錄儀的內容呢?刪除行車...