在 SQLite 中刪除資料後 SQLite 的檔案大小並不會立刻有變化,資料確實有刪除成功,但是這些空間不會馬上被釋放,但也不會被浪費,只是被標記為已刪除,未來有需要時就會使用到這些空閒的空間。
如果刪除了許多資料,想要立刻釋放空間該怎麼處理?很簡單,一行指令即可:
VACUUM
上面的作法是將資料複製到暫存檔內,將原本的資料清空,然後還原暫存資料,並且在還原時還會將破碎的內容整理,進一步減少占用空間。只是這樣做代表 VACUUM 在執行時會有一瞬間占用 SQLite 原始檔案大小的兩倍空間,然後清除掉所有實際未被刪除的內容,完全無法恢復已刪除的資料。
在 C# 中要執行可以參考以下的程式碼(需要安裝 Microsoft.Data.Sqlite 套件):
string connectionString = "Data Source=database.db;Version=3;";
try
{
using (SQLiteConnection connection = new SQLiteConnection(connectionString))
{
connection.Open();
using (SQLiteCommand command = new SQLiteCommand("VACUUM", connection))
{
command.ExecuteNonQuery();
}
connection.Close();
}
Console.WriteLine("已釋放 SQLite 空間");
}
catch (Exception ex)
{
Console.WriteLine("發生錯誤:" + ex.Message);
}
需要注意的是 VACUUM 指令不能在事務(Transaction)中執行,會拋出以下例外:
code = Error (1), message = System.Data.SQLite.SQLiteException (0x800007BF): SQL logic error
cannot VACUUM from within a transaction
參考資料:
SQLite - VACUUM
留言
張貼留言
如果有任何問題、建議、想說的話或文章題目推薦,都歡迎留言或來信: a@ruyut.com