適用於:SQL Server 2016 (13.x) 和更新版本
Azure SQL 受控執行個體
適用於 記憶體最佳化資料表 的系統版本控制時態資料表,對於需要針對使用記憶體內 OLTP 工作負載所收集的資料進行 資料稽核與時間點分析 的情境而言,提供了符合成本效益的解決方案。
Note
記憶體優化時態表僅適用於 SQL Server 和 Azure SQL 受控實例。 記憶體優化數據表和時態表可在 Azure SQL Database 中獨立使用。
Overview
系統版本設定時態表會自動保留資料變更的完整歷程記錄,並公開便利的 Transact-SQL 延伸模組以進行時間點分析。 在典型情況下,資料歷史會被保存很長一段時間(數月甚至數年),即使不會定期查詢。
資料稽核與基於時間的分析在不同環境中可能被要求,尤其是在處理極大量請求且使用記憶體內 OLTP 技術的 OLTP 系統中。 不過,在時態表案例中使用經記憶體最佳化的資料表很困難,因為大量產生的歷史資料通常會超過可用 RAM 的限制。 同時,使用 RAM 來儲存隨著越舊而越少存取的唯讀歷史資料並非最佳的解決方案。
系統版本化的時序表用於記憶體優化的資料表,提供高交易吞吐量與無鎖的並行性。 你可以透過記憶體內的資料表(時間表)來儲存大量歷史資料,並使用磁碟資料表來儲存歷史資料。 透過使用內部、自動產生的記憶體最佳化暫存表格以儲存最近歷程記錄,並使 DML 可以從原生編譯的程式碼執行,進而降低對 DML 作業的影響。
下圖說明此架構。
實作詳細資料
當您建立系統版本設定的經記憶體最佳化的資料表時,請注意下列考量。 關於語法選項及範例,請參見 CREATE TABLE。
只有持久性記憶體最佳化資料表可以啟用系統版本控制 (
DURABILITY = SCHEMA_AND_DATA)。記憶體優化系統版本表的歷史表必須是基於磁碟的,無論是你建立它還是系統建立它。
你可以在 原生編譯的 T-SQL 模組 中使用僅影響目前記憶體內部資料表的查詢。 原生編譯的模組不支援此
FOR SYSTEM TIME子句,但臨時查詢與非原生模組可對記憶體優化資料表使用此子句。當
SYSTEM_VERSIONING = ON時,系統會自動建立一個內部記憶體最佳化的暫存表,以接受最新的系統版本變更,這些變更是對當前記憶體優化資料表的更新與刪除操作所產生的。非同步資料清除任務會定期將資料從內部記憶體優化的暫存表移至磁碟基礎的歷史表。 此資料排清機制可將其父物件的內部記憶體緩衝區使用量維持低於 10%。 您可以透過查詢 sys.dm_db_xtp_memory_consumers,並彙總內部記憶體優化的暫存表與目前時序表的資料,來追蹤記憶體優化系統版本時空表的總記憶體消耗量。
若要手動進行資料沖洗,請執行 sp_xtp_flush_temporal_history。
使用
SYSTEM_VERSIONING = OFF,或當你透過新增、刪除或修改欄位來修改系統版本資料表的結構時,內部暫存緩衝區的全部內容會被移入磁碟基礎的歷史資料表。查詢歷史資料時,實際上會採用快照隔離層級,並且一律傳回記憶體中的暫存緩衝區與磁碟式資料表的聯集,且不含重複資料。
ALTER TABLE在內部更改資料表結構的操作必須執行資料清空,這可能會延長操作時間。
內部記憶體最佳化暫存表格
此系統會建立內部記憶體最佳化暫存表格,以最佳化 DML 作業。
資料表名稱使用以下格式:
Memory_Optimized_History_Table_<object_id>其中<object_id>是目前時序資料表的識別碼。該表格會複製目前時序表的結構,加上一欄 bigint 。 這個額外的欄位可確保移至內部歷史緩衝區的資料列具唯一性。
額外的資料行具有下列名稱格式:
Change_ID[<suffix>],其中<suffix>是在資料表已經有Change_ID資料行時選擇性新增。由於中繼表中多了一個額外的 bigint 資料行,系統版本控制記憶體最佳化資料表的資料列大小上限會減少 8 位元組。 最大值目前為 8,052 位元組。
內部的記憶體最佳化暫存表不會顯示於 SQL Server Management Studio 的 物件總管 中。
你可以在 sys.internal_tables中找到關於此表及其與當前時間表關聯的元資料。
資料排清工作
資料洗淨任務會定期執行,並檢查任何記憶體最佳化的資料表是否符合基於記憶體大小的資料移動條件。 當內部暫存表的記憶體消耗達到當前時序表記憶體的 8% 時,資料移動開始。
資料排清工作會依排程 (視現有的工作負載而定) 定期啟動。 使用繁重的工作負載,此工作會每隔 5 秒執行一次。 工作負載降低時,頻率會增加至每分鐘一次。 每個需要清理的內部記憶體最佳化暫存資料表都會產生一個執行緒。
資料排清會刪除比目前執行之最舊的交易還舊的記憶體內部內部緩衝區記錄,以將這些記錄移動到以磁碟為基礎的歷程記錄資料表。
您可以執行 sp_xtp_flush_temporal_history 並指定結構描述和表格名稱,以執行資料排清:
EXEC sys.sp_xtp_flush_temporal_history <schema_name>, <object_name>;
資料移動程序的叫用方式與系統在其內部排程上執行資料排清工作時相同。