共用方式為


維護資料庫 (SQL Server Compact)

時間一久,Microsoft SQL Server Compact 資料庫的內部結構可能會形成許多小片段,導致浪費磁碟空間。如果片段過多,效能會因而下降。為了避免過多片段,請使用下述功能維護 SQL Server Compact 資料庫。

如需使用此主題中所述方法及屬性的詳細資訊,請參閱<System.Data.SqlServerCe>。

壓縮

您可使用 Compact 方法 (原生程式設計中的 CompactDatabase 方法) 來回收資料庫檔案中的空間,也可用它來變更資料庫設定,例如密碼及地區設定識別碼 (LCID)。

SQL Server Compact 資料庫檔案會分割成 4 KB 的邏輯單位,稱為頁面。隨著持續修改資料庫,某些頁面可能包含未使用空間,而某些頁面甚至未使用。未使用頁面最終會以 AutoShrink 機制回收。如需詳細資訊,請參閱本章稍後的「自動壓縮」一節。

頁面上的未使用空間只能使用 Compact 方法回收。Compact 方法從來源資料庫讀取資料列,並將這些資料列寫入目的地資料庫,使目的地資料庫浪費最少的空間。

注意

如果並未指定目的地資料庫的 Data Source 屬性,Compact 方法會使用新壓縮的資料庫以相同名稱覆寫來源資料庫。

在壓縮資料庫時:

  • 會重新建立新的資料庫並建立新的索引。

  • 會重組資料表頁面以使其位在相鄰的資料庫頁面中,這可減少整個資料庫的資料表片段,因而改善空間配置。

  • 刪除物件與記錄所產生的未使用空間,可透過將所有資料庫資料重新寫入新的資料頁面來回收。當物件與記錄從資料庫中刪除時,其原本佔用的空間會標示為可供新增到資料庫的資料使用。除非刪除整個頁面的資料,否則頁面會保持部分填入狀態。必須等到從頁面刪除最後的資料或壓縮資料庫後,資料庫才會縮小。對於頻繁新增、刪除及更新物件與記錄的資料庫,我們建議您經常進行壓縮。

  • 增量的識別欄位會重設,以便下一個配置的值會比剩餘記錄中的最高值多 1 個間距值。例如,刪除資料庫中的所有記錄後,壓縮資料庫會將下一筆記錄的識別欄位值設為種子值。如果資料庫中的最高剩餘識別值是 50,且間距值是 5,壓縮資料庫會將下一筆記錄的值設為 55。如果先前新增的記錄包含大於 50 的值,但已在壓縮前刪除該記錄,此規則依然成立。間距值也可以是負值,例如 –5,如果最小值為 15,則壓縮資料庫會將下一筆記錄的值設為 10。

    注意

    如果您是使用原始發行版本的 Visual Studio 2008,就會發生此行為。壓縮資料庫並不會變更 Visual Studio 2008 SP1. 中的識別資訊。

  • 如果在目的地資料庫連接字串中指定地區設定識別碼或密碼的值,建立目的地資料庫時將會使用這些值。

在壓縮資料庫之前,請確認下列條件為真:

  • 資料庫必須關閉。

  • 呼叫 Compact 方法時,不能有目的地資料庫存在。如果由 DestConnection 指定的資料庫已經存在,或是已存在具有該名稱的其他檔案,將會發生錯誤。

  • 除了儲存任何快取資料及暫存資料庫中的資料外,還必須要有足夠空間用於儲存資料庫的原始版本和壓縮版本。

重要

若要使用 Compact 方法,您的裝置至少要有兩倍於來源資料庫大小的可用空間。

自動壓縮

若要壓縮資料庫,您必須建立新的資料庫,然後將所有物件從來源資料庫複製到新的資料庫。一般來說,壓縮不會自動啟始。自動調整資料庫檔案大小稱為 AutoShrink,此技術幾乎用不到處理器時間及記憶體,使它特別適合手持裝置及行動資料庫產品。Autoshrink 技術會移動檔案中的頁面,使所有空的或未配置的頁面連續地放置在檔案的尾端。然後,空的頁面會被截斷,這些截斷的頁面便可供資料庫檔案系統使用,將截斷的頁面歸還給資料庫檔案系統使用可增加檔案系統空間。

若要以 Managed 程式碼來設定 Autoshrink,請使用 AutoShrink Threshold 連接字串屬性。若是機器碼,請使用 DBPROP_SSCE_AUTO_SHRINK_THRESHOLD 屬性。此屬性會在 Autoshrink 開始前指定檔案的可用空間百分比。

注意

您也可呼叫 Shrink 方法來壓縮資料庫。如需詳細資訊,請參閱<System.Data.SqlServerCe>。

驗證

SQL Server Compact 資料庫檔案會分割成 4 KB 的邏輯單位,稱為頁面。在各個頁面寫入資料庫檔案時,SQL Server Compact 會計算並儲存該頁面的總和檢查碼。如果該頁面在寫入檔案之後受到修改或損毀,就不會符合預期的總和檢查碼。當 SQL Server Compact 讀取此頁面時,會傳回原生錯誤 SSCE_M_DATABASECORRUPTED (25017)。

呼叫 SqlCeEngine 類別的 Verify 方法,會重新計算資料庫檔案中每個頁面的總和檢查碼,並且驗證其總和檢查碼是否符合預期的值。若此方法傳回 true,就表示沒有任何資料庫檔案損毀。若此方法傳回 false,則表示資料庫檔案已受損,而且應用程式應該呼叫 Repair 方法。

修復

如果資料庫檔案受損,您可以使用 SqlCeEngine 物件的 Repair(System.String,System.Data.SqlServerCe.RepairOption) 方法,或使用原生 程式設計引擎物件 (SQL Server Compact) 的 Repair 方法,嘗試修復資料庫檔案。Repair 方法會掃描資料庫,並且計算頁面的總和檢查碼。如果總和檢查碼與先前該頁面寫入資料庫時所計算的總和檢查碼不符,就會認為此頁面已損毀。有四個可用的 RepairOption。如需有關這些選項如何運作的詳細資訊,請參閱<如何:驗證及修復資料庫 (以程式設計方式)>。

注意

Repair 方法僅適用於 SQL Server Compact 傳回原生錯誤 SSCE_M_DATABASECORRUPTED (25017),或者適用於呼叫 SqlCeEngine 物件的 Verify 方法而傳回 false 的情況。

自動清除

當資料庫因交易而發生變更時,這些變更會先保留在緩衝集區內,直到交易認可或中止。如果交易中止,便會捨棄這些變更。如果交易認可,其他使用者及交易便可看見這些變更,但可能不會立即將變更寫入資料庫。如果發生不正常的程式終止,例如裝置重設,已認可但其變更尚未寫入資料庫的交易將會被捨棄。

請注意交易一定會依照其認可順序寫入資料庫,這表示儘管某些交易可能遺失,資料庫永遠維持一致。例如,若應用程式已認可交易 A,然後認可交易 B,如果此時應用程式損毀或裝置重設,資料庫將會位於下列三種狀態之一:

  • 未變更

  • 由交易 A 變更

  • 由 A 和 B 兩者變更

依認可的順序將交易寫入資料庫可降低必須寫入資料庫檔案的次數,因而改善效能。如果在短時間內認可許多小交易,效能改善情形會特別顯著。在此情況下,所有交易會同時寫入資料庫檔案,而不是每個交易都引發個別的資料庫寫入作業。

將緩衝集區內的暫止變更寫入資料庫或清除的時間間隔,是依據 ADO.NET 中的 Flush Interval 連接字串屬性 (OLE DB 中的 DPROP_SSCE_FLUSH_INTERVAL 屬性) 所指定。這些屬性設定將已認可的交易清除到磁碟前的最大秒數。

注意

對於認可後必須保存到資料庫的交易,應用程式可利用 CommitMode 列舉 (或 OLE DB 中的 DBPROP_SSCE_TRANSACTION_COMMIT_MODE 屬性) 在認可時覆寫預設的清除行為。藉由使用這些屬性,應用程式便能保證所有在資料庫中發生的交易都能成功保存。

備份/還原/卸除

由於 SQL Server Compact 是以檔案為基礎的資料庫系統,您可使用檔案系統 API 來完成許多一般資料庫工作,例如備份、還原及刪除資料庫。

  • 若要備份資料庫,請關閉所有資料庫連接,然後複製 .sdf 檔案。

  • 若要卸除資料庫,請刪除 .sdf 資料庫檔案。

請參閱

參考

CompactDatabase 方法 (SQL Server Compact)

Repair 方法 (SQL Server Compact)