1. 程式人生 > >SQLite--Vacuum命令(釋放空間)

SQLite--Vacuum命令(釋放空間)

前言

有些朋友可能會有這種疑惑,為什麼明明刪除了許多資料,資料庫檔案的大小卻沒有變化,這是因為從Sqlite刪除資料後,未使用的磁碟空間被新增到一個內在的”空閒列表”中用於儲存你下次插入的資料。磁碟空間並沒有丟失。但是也不向作業系統返回磁碟空間。

既然知道原因,當然也有解決方法,就是現在要講的Vacuum命令。

Vacuum

VACUUM 命令通過複製主資料庫中的內容到一個臨時資料庫檔案,然後清空主資料庫,並從副本中重新載入原始的資料庫檔案。這消除了空閒頁,把表中的資料排列為連續的,另外會清理資料庫檔案結構。

如果表中沒有明確的整型主鍵(INTEGER PRIMARY KEY),VACUUM 命令可能會改變表中條目的行 ID(ROWID)。VACUUM 命令只適用於主資料庫,附加的資料庫檔案是不可能使用 VACUUM 命令。

如果有一個活動的事務,VACUUM 命令就會失敗。VACUUM 命令是一個用於記憶體資料庫的任何操作。由於 VACUUM 命令從頭開始重新建立資料庫檔案,所以 VACUUM 也可以用於修改許多資料庫特定的配置引數。

手動 VACUUM

下面是在命令提示符中對整個資料庫發出 VACUUM 命令的語法:

sqlite3 database_name "VACUUM;"

在 SQLite 提示符中執行 VACUUM,如下所示:

sqlite> VACUUM;

也可以在特定的表上執行 VACUUM,如下所示:

sqlite> VACUUM table_name;

Auto-VACUUM

SQLite 的 Auto-VACUUM 與 VACUUM 不大一樣,它只是把空閒頁移到資料庫末尾,從而減小資料庫大小。

但只會從資料庫檔案中截斷空閒列表中的頁, 而不會回收資料庫中的碎片,也不會像VACUUM 命令那樣重新整理資料庫內容。實際上,由於需要在資料庫檔案中移動頁, auto-vacuum 會產生更多的碎片。而且,在執行刪除操作的時候,也有那個.db-journal檔案產生。

要使用auto-vacuum,需要一些前題條件。 資料庫中需要儲存一些額外的資訊以記錄它所跟蹤的每個資料庫頁都找回其指標位置。 所以,auto-vacumm 必須在建表之前就開啟。在一個表建立之後, 就不能再開啟或關閉 auto-vacumm。

從命令提示符中執行下面的命令來檢查 auto-vacuum 設定:

sqlite3 database_name "PRAGMA auto_vacuum";

在 SQLite 提示符中,您可以通過下面的編譯執行,啟用/禁用 SQLite 的 Auto-VACUUM:

sqlite> PRAGMA auto_vacuum = NONE;  -- 0 means disable auto vacuum
sqlite> PRAGMA auto_vacuum = INCREMENTAL;  -- 1 means enable incremental vacuum
sqlite> PRAGMA auto_vacuum = FULL;  -- 2 means enable full auto vacuum

要想了解 PRAMA 命令的使用和功能,可以看看我的另一篇部落格SQLite的PRAGMA命令

結束語:本文僅用來學習記錄,參考查閱。