SQLite 刪除資料後釋放檔案大小(附 C# 程式碼)


在 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

留言