系統版本設定時態表與經記憶體最佳化的資料表
適用於:SQL Server 2016 (13.x) 和更新版本 Azure SQL 資料庫 Azure SQL 受控執行個體
經記憶體最佳化的資料表之系統版本設定時態表,可為了在利用記憶體內部 OLTP 工作負載所收集的最上層資料需要資料稽核與時間點分析時,提供符合成本效益的解決方案。
概觀
系統版本設定時態表會自動保留資料變更的完整歷程記錄,並公開便利的 Transact-SQL 延伸模組以進行時間點分析。 在一般案例中,即使沒有經常查詢資料記錄,資料記錄仍會保留很長一段時間 (數個月甚至是數年)。
資料稽核及以時間為基礎的分析可能在不同環境中要求,特別是在處理極大量要求數目以及使用記憶體內部 OLTP 技術的 OLTP 系統中。 不過,在時態表案例中使用經記憶體最佳化的資料表很困難,因為大量產生的歷史資料通常會超過可用 RAM 的限制。 同時,使用 RAM 來儲存隨著越舊而越少存取的唯讀歷史資料並非最佳的解決方案。
注意:經記憶體最佳化的資料表的系統版本設定時態表,可提供高交易輸送量和無鎖定同時並行處理。 其可讓您使用記憶體內部資料表來儲存目前資料 (時態表),以及使用以磁碟為基礎的資料表儲存歷史資料,以儲存大量的歷程記錄資料。 透過使用內部、自動產生的記憶體最佳化暫存表格以儲存最近歷程記錄,並使 DML 可以從原生編譯的程式碼執行,進而降低對 DML 作業的影響。
下圖說明此架構。
實作詳細資料
當您建立系統版本設定的經記憶體最佳化的資料表時,請注意下列考量。 如需語法選項及範例,請參閱<CREATE TABLE>。
只有持久的經記憶體最佳化的資料表可以是系統版本設定 (
DURABILITY = SCHEMA_AND_DATA
)。記憶體最佳化系統版本設定資料表的歷程記錄資料表,必須是以磁碟為基礎,無論其是由終端使用者或系統建立。
只有影響目前記憶體內部資料表的查詢可用於原生編譯的 T-SQL 模組。 原生編譯的模組不支援使用
FOR SYSTEM TIME
子句的暫時查詢。 支援在特定查詢和非原生模組中搭配使用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 中找到。
資料排清工作
資料排清是定期啟動的工作,檢查是否有任何記憶體最佳化資料表符合資料移動的記憶體大小條件。 當內部暫存表格的記憶體使用量到達目前時態表記憶體使用量的百分之八時,就會開始移動資料。
資料排清工作會依排程 (視現有的工作負載而定) 定期啟動。 使用繁重的工作負載,此工作會每隔 5 秒執行一次。 工作負載降低時,頻率會增加至每分鐘一次。 針對每個需要清除的內部記憶體最佳化暫存資料表會產生一個執行序。
資料排清會刪除比目前執行之最舊的交易還舊的記憶體內部內部緩衝區記錄,以將這些記錄移動到以磁碟為基礎的歷程記錄資料表。
您可以執行 sp_xtp_flush_temporal_history
並指定結構描述和表格名稱,以執行資料排清:
EXEC sys.sp_xtp_flush_temporal_history <schema_name>, <object_name>;
資料移動程序的叫用方式與系統在其內部排程上執行資料排清工作時相同。