解決sqlite刪除資料後,檔案大小不變問題

2021-06-07 02:23:43 字數 1711 閱讀 1298

說了這麼多,沒進主題,我的主題是給

sqlite

在刪除資料後擦屁股。

大家或許發現了,當你在

sqlite

中刪除了大量資料後,資料庫檔案的大小還是那樣,沒有變。

就用我的專案來說,

3m的資料刪除後,

sqlite

的.db

檔案依然是

3m,而我要的結果實際上只有

35k,在壓縮一下也就10幾

k了。為什麼會出現這個問題,

sqlce

的.sdf

檔案是即刪即減的。

原因是:

當你從sqlite

刪除資料後,未使用的磁碟空間被新增到乙個內在的

」空閒列表

」中用於儲存你下次插入的資料。磁碟空間並沒有丟失。但是也不向作業系統返回磁碟空間。(嘿嘿,

sqlite.org

的faq

中提到過這個問題)

解決方法:兩種 一,

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

objsqlhelper.executenonquery(commandtype.text, "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的方式對碎片的造成情況,如果資料交換次數多的話,這種方式很不合適。

還是決定用第一種方式,在大資料刪除後,向伺服器送信前。執行vacuum命令。這樣做比較划算。

解決sqlite刪除資料後,檔案大小不變問題

說了這麼多,沒進主題,我的主題是給sqlite在刪除資料後擦屁股。大家或許發現了,當你在sqlite中刪除了大量資料後,資料庫檔案的大小還是那樣,沒有變。就用我的專案來說,3m的資料刪除後,sqlite的.db檔案依然是3m,而我要的結果實際上只有35k,在壓縮一下也就10幾k了。為什麼會出現這個問...

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

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

oracle刪除資料檔案

在我們詳細介紹之前,我們必須說清楚一點 oracle不提供如刪除表 檢視一樣刪除資料檔案的方法,資料檔案是表空間的一部分,所以不能 移走 表空間。一 使用offline資料檔案的方法 非歸檔模式使用 alter database datafile offline drop 歸檔模式使用 alter ...