共用方式為


記憶體最佳化資料表的持久性

適用於:SQL Server

記憶體內部 OLTP 針對經記憶體最佳化的資料表提供完整的持久性。 當變更記憶體最佳化資料表的交易認可時,SQL Server (就像磁碟型資料表一樣) 保證變更是永久的 (它們在資料庫重新啟動後仍能持續存在),前提是基礎儲存體可用。 持久性有兩個重要元件:交易記錄及磁碟儲存的保存資料變更。

如需瞭解任何持久資料表的大小限制的詳細資訊,請參閱 預估記憶體最佳化資料表的記憶體需求

交易記錄

磁碟基礎的資料表或持久記憶體最佳化資料表的所有變更,都可以在一個或多個交易記錄檔記錄上擷取。 交易認可時,SQL Server 將交易相關的記錄資料列寫入磁碟後,才會與交易認可的應用程式或使用者工作階段通訊。 這樣可保證交易所做的變更是持久的。 記憶體最佳化資料表的交易記錄檔會與磁碟資料表所使用的相同記錄檔資料流完全整合在一起。 此整合可讓現有的交易記錄備份、復原和還原作業繼續運作,而不需要任何額外的步驟。 不過,由於 In-Memory OLTP 可以大幅增加工作負載的交易輸送量,因此日誌 IO 可能會成為效能瓶頸。 若要維持增加的輸送量,請確定記錄 IO 子系統可以處理增加的負載。

資料和增量檔案

記憶體最佳化資料表中的資料會在記憶體內部堆積資料給構中儲存為自由格式的資料列,並透過一或多個記憶體內部索引連結。 資料列沒有任何頁面結構,例如用於磁碟基礎的資料表頁面結構。 為長期保存並允許截斷交易記錄,經記憶體最佳化的資料表的作業會保存在一組資料和差異檔案中。 這些檔案是使用非同步背景處理程序根據交易記錄產生。 資料和差異檔案位於一個或多個容器 (和 FILESTREAM 資料使用相同的機制)。 這些容器屬於記憶體最佳化檔案群組。

資料會遵循嚴格的順序寫入,使轉動式媒體的磁碟延遲減到最少。 您可以在不同的磁碟上使用多個容器以散發 I/O 活動。 當從磁碟上的資料和增量檔案讀取資料到記憶體時,在不同磁碟的多個容器中的資料和增量檔案會提升資料庫的還原及復原效能。

使用者交易不會直接存取資料和增量檔案。 所有資料讀寫皆使用記憶體內部資料結構。

資料檔

資料檔案包含了由 INSERT 或 UPDATE 作業中的多筆交易所插入的一個或多個記憶體最佳化資料表而來的資料列。 例如,某個資料列可能來自記憶體最佳化資料表 T1,而下一個資料列可能來自記憶體最佳化資料表 T2。 資料列會以交易記錄中的交易順序附加到資料檔案,好讓資料存取循序進行。 相較於隨機 I/O,這樣的重要性順序會產生較佳的 I/O 輸送量。

一旦資料檔案已滿,新交易所插入的資料列將會儲存至另一個資料檔案。 隨著時間推移,持久記憶體最佳化資料表中的資料列會儲存在其中一個資料檔案中,而包含資料列的每個資料檔案都會形成不相連但連續的交易範圍。 例如,交易認可時間戳記範圍為 (100, 200) 的資料檔案,包含交易 (具有大於 100 及小於或等於 200 的認可時間戳記) 所插入的所有資料列。 提交時間戳記是在交易準備提交時分配的按順序遞增的數字。 每筆交易都有其獨一無二的認可時間戳記。

刪除或更新資料列時,不會在資料檔案中就地移除或變更該資料列,而是透過 delta 檔案來追蹤已刪除的資料列。 每個資料列的刪除和插入作業將統整為 Tuple,藉此處理更新作業。 這可使資料檔案排除隨機 IO。

大小:若為記憶體大於 16GB 的電腦,每個資料檔案的大小約為 128MB;若為記憶體小於或等於 16GB 的電腦,每個資料檔案的大小約為 16MB。 在 SQL Server 2016 (13.x) 中,如果 SQL Server 認為儲存體子系統夠快,就會使用大型的檢查點模式。 在大型的檢查點模式中,資料檔案的大小為 1GB。 這可讓高輸送量工作負載的儲存子系統有更高的效率。

差異檔案

每一個資料檔案皆會與具有相同交易範圍,且將追蹤由該交易範圍內的交易所插入之已刪除資料列的差異檔案進行配對。 此資料與差異檔案稱為檢查點檔案配對(CFP),它是配置和解除配置的單位,也是合併操作的單位。 例如,對應至交易範圍 (100, 200) 的差異檔案會儲存範圍 (100, 200) 中交易插入的已刪除資料列。 就像資料檔案,對差異檔案的存取也是循序進行。

刪除資料列時,資料列不會從資料檔中移除,而是將該資料列的參考附加到與插入這個資料列之交易範圍相關聯的增量檔案。 由於要刪除的資料列已存在於資料檔案中,差異檔案只會儲存參考資訊 {inserting_tx_id, row_id, deleting_tx_id} ,且將遵照原始刪除或更新作業的交易記錄順序。

大小:若為記憶體大於 16 GB 的電腦,每個差異檔案的大小約為 16 MB;若為記憶體小於或等於 16 GB 的電腦,每個差異檔案的大小約為 1 MB。 啟動 SQL Server 2016 (13.x) 後,如果 SQL Server 認為儲存體子系統夠快,就會使用大型的檢查點模式。 在大型的檢查點模式中,差異檔案的大小為 128MB。

填充資料及delta檔案

資料檔案和差異檔案會根據記憶體最佳化資料表認可交易所產生的交易記錄填寫,再將已插入及刪除的資料列相關資訊附加到適當的資料檔案和差異檔案。 不同於在檢查點完成時以隨機 I/O 方式排清資料/索引頁的磁碟資料表,記憶體最佳化資料表的保存是連續的背景作業。 如此將會存取多個差異檔案,因為交易可以刪除或更新任何先前交易所插入的任何資料列。 刪除資訊一律會附加到差異檔案的結尾。 例如,認可時間戳記為 600 的交易會插入一個新資料列,並刪除認可時間戳記為 150、250 和 450 的交易所插入的資料列,如下圖所示。 所有的四個檔案 I/O 操作(其中三個用於已刪除的資料列,1 個用於新插入的資料列),都是只追加至相應差異和資料檔案的操作。

記憶體最佳化資料表的讀取記錄記錄螢幕擷取畫面。

存取資料和增量檔案

在以下事件發生時,會存取資料檔案與增量檔案配對。

離線檢查站工作人員

此執行緒會將記憶體最佳化的資料列的插入和刪除,附加到對應的資料檔案和差異檔案組。 SQL Server 2014(12.x)有一個離線檢查點背景工作者。 SQL Server 2016 (13.x)和更新版本有多個檢查點工作者。

合併作業

此作業會合併一個或多個資料檔案和差異檔案組,並且建立新的資料檔案和差異檔案組。

當機復原期間

重新啟動 SQL Server 或資料庫重新連線後,記憶體最佳化資料會使用資料與差異檔案組填入。 從對應的資料檔案讀取資料列時,差異檔案會當做已刪除之資料列的篩選條件。 因為每個資料和差異檔案組是獨立的,所以這些檔案會平行載入,以減少將資料擴展到記憶體所花的時間。 將資料載入記憶體之後,In-Memory OLTP 引擎會套用檢查點檔案尚未涵蓋的作用中交易記錄記錄,讓記憶體最佳化資料完成。

還原作業期間

記憶體中 OLTP 檢查點檔案是從資料庫備份所建立,然後套用一個或多個交易記錄備份。 如同損毀復原,In-Memory OLTP 引擎會平行將資料載入記憶體,以將復原時間的影響降到最低。

合併數據和增量檔案

記憶體最佳化資料表的資料是儲存於一個或多個資料檔案和差異檔案組 (又稱為檢查點檔案組或 CFP)。 資料檔案會儲存已插入的資料列,而差異檔案將參考已刪除的資料列。 在執行 OLTP 工作負載期間,隨著 DML 作業更新、插入和刪除資料列,會建立新的 CFP 以保存新資料列,並且將已刪除之資料列的參考附加至差異檔案。

隨著時間推移,使用 DML 作業時,資料和差異檔案的數目會增加,導致磁碟空間使用量增加,並增加復原時間。

為了協助防止這些低效率,根據本文稍後描述的合併原則,將較舊的已關閉數據檔和 delta 檔合併,以壓縮儲存陣列來代表同一組資料,並減少檔案的數量。

合併作業會將一或多個相鄰的已關閉檢查點檔案配對(CFP)作為輸入,這些檔案配對由資料檔和差異檔組成(稱為合併來源),並根據內部定義的合併原則進行合併,產生一個結果 CFP,稱為合併目標。 來源 CFP 的每個差異檔案中的條目可用來篩選對應資料檔中的資料列,以移除不需要的資料列。 來源 CFP 中剩餘的資料列則會合併成單一目標 CFP。 合併完成之後,產生的合併目標 CFP 會取代來源 CFP (合併來源) 。 在從儲存體中移除之前,合併來源的 CFP 會經歷一個過渡階段。

在下列範例中,記憶體最佳化的資料表檔案群組在時間戳記 500 時有四組資料和增量檔案組,包含先前交易的資料。 例如,第一個資料檔案中的資料列對應到時間戳記大於 100 且小於或等於 200 (或者以 (100, 200] 表示) 的交易。 在考量到資料列標記為已刪除的情況下,第二和第三個資料檔案會顯示為低於 50% 已滿。 合併作業會結合這兩個 CFP 並且建立新的 CFP,其包含了時間戳記大於 200 且小於或等於 400 的交易,也就是這兩個 CFP 合併的範圍。 如您所見,另有一個 CFP 的範圍為 (500, 600] 以及在交易範圍 (200, 400] 的非空白差異檔案,表示合併作業可與交易活動同時完成,包括刪除來源 CFP 中的更多資料列。

圖表顯示記憶體最佳化資料表檔案群組。

背景執行緒會使用合併原則評估所有已關閉的 CFP,然後起始一項或多項對合格 CFP 的合併要求。 這些合併要求將由離線檢查點執行緒來處理。 系統會定期評估合併原則,以及在檢查點關閉時進行評估。

SQL Server 合併原則

SQL Server 實作以下合併原則:

  • 如果在考慮已刪除的資料列之後,可以合併兩個或多個連續的 CFP,則會排定合併,以便產生的資料列可以適合一個目標大小的 CFP。 資料和增量檔案的目標大小與原始大小相符,如先前所述。

  • 如果資料檔案超過兩倍的目標大小,而且一半以上的資料列已刪除,則單一 CFP 可以自行合併。 例如,如果單一交易或多個並行交易插入或更新大量資料,資料檔案可能會成長到超過目標大小,因為交易無法跨越多個 CFP。

以下是一些範例,展示根據合併原則進行合併的 CFP:

相鄰 CFP 檔案來源(百分比完整) 合併選取範圍
CFP0 (30%)、CFP1 (50%)、CFP2 (50%)、CFP3 (90%) (CFP0、CFP1)

未選擇 CFP2,因為它會使產生的資料檔案大於理想大小的 100%。
CFP0 (30%)、CFP1 (20%)、CFP2 (50%)、CFP3 (10%) (CFP0、CFP1、CFP2)。 從左邊開始選擇檔案。

未選擇 CFP3,因為它會使產生的資料檔案大於理想大小的 100%。
CFP0 (80%)、CFP1 (30%)、CFP2 (10%)、CFP3 (40%) (CFP1、CFP2、CFP3)。 從左邊開始選擇檔案。

會略過 CFP0,因為如果與 CFP1 結合,則產生的資料檔會大於理想大小的 100%。

並非所有餘留可用空間的 CFP 都有資格進行合併。 例如,如果兩個相鄰的 CFP 已滿 60%,則它們不符合合併資格,而且每個 CFP 都有 40 個% 未使用的儲存體。 在最壞的情況下,所有 CFP 只有 50% 的容量,儲存利用率僅為 50%。 雖然已刪除的資料列可能因為 CFP 不符合合併的資格而存在於儲存體中,但已刪除的資料列可能已透過記憶體垃圾回收從記憶體中移除。 儲存體和記憶體的管理與記憶體回收無關。 作用中 CFP 所佔用的儲存體 (並非所有 CFP 都會更新) 最多可以比記憶體中持久資料表的大小大兩倍。

CFP 的生命週期

CFP 在解除配置之前會歷經幾個過渡狀態。 轉換檔案的各個階段都要設定資料庫檢查點與備份記錄檔,最後清除不再需要的檔案。 如需這些階段的說明,請參閱 sys.dm_db_xtp_checkpoint_files

您可以在記錄檔備份後面手動強制建立檢查點,以加速記憶體回收。 在生產案例中,作為備份策略一部分的自動檢查點和日誌備份可順貫地將 CFP 過渡到這些階段,而無需任何手動干預。 垃圾收集程序的影響是,具有記憶體最佳化資料表的資料庫其儲存空間大小可能會比記憶體大小更大。 如果檢查點和日誌備份未發生,檢查點檔案的磁碟佔用空間會繼續增加。