適用於: SQL Server 2016 (13.x) 和更新版本
Azure SQL Database
Azure SQL 受控執行個體
Microsoft Fabric 中的 SQL 資料庫
在使用時序表時,請注意以下因系統版本控制特性而產生的限制與考量:
時序表必須定義主鍵,以將當前資料表與歷史資料表之間的紀錄對應。 歷程資料表不能定義主索引鍵。
記錄
SYSTEM_TIME和ValidFrom值所用的ValidTo期間資料行,必須使用 datetime2 的資料類型加以定義。時間語法適用於資料庫中儲存在本機的資料表或檢視。 對於連結伺服器上的資料表或外部資料表等遠端物件,您無法直接在查詢中使用
FOR子句或期間謂詞。若在建立歷程記錄資料表時指定歷程記錄資料表名稱,則您必須指定結構描述和資料表名稱。
根據預設,歷程記錄資料表會採
PAGE壓縮處理。如果目前的資料表是分割的,歷史資料表會在預設檔案群組上建立,因為分割設定不會自動從目前資料表複製到歷史資料表。
時態表和歷程記錄資料表都無法使用 FileTable 或 FILESTREAM。 FileTable 和 FILESTREAM 允許 SQL Server 外部的資料操作,因此無法保證系統版本設定。
節點或邊緣資料表無法建立成或變更為時態表。
時態表支援 Blob 資料類型 (例如 (n)varchar(max)、varbinary(max)、(n)text 和 image),但會產生龐大的儲存成本,且其大小會影響效能。 在設計系統時,使用這些資料類型時要小心。
歷程記錄資料表必須建立於與目前資料表相同的資料庫中。 不支援透過連結伺服器的時態查詢。
歷程記錄資料表不能包含限制條件(主鍵、外鍵、資料表限制條件或資料行限制條件)。
不支援在時態查詢 (使用
FOR SYSTEM_TIME子句的查詢) 之上建立索引檢視。在系統版本設定時態表中,Online 選項 (
WITH (ONLINE = ON) 並不會影響ALTER TABLE ALTER COLUMN。 無論為ALTER選項指定哪一個值,ONLINE資料行都不會以線上作業方式執行。INSERT和UPDATE陳述式無法參考SYSTEM_TIME期間資料行。 若嘗試將值直接插入這些資料行,則會遭到系統封鎖。當
TRUNCATE TABLE為SYSTEM_VERSIONING時,不支援ON。不允許直接修改歷程記錄資料表中的資料。
為避免使資料操作語言(DML)邏輯失效,目前資料表和歷史資料表都不允許使用
INSTEAD OF觸發程序。AFTER觸發程序僅允許用於目前的資料表。 這些觸發程序在歷程記錄資料表上會遭到封鎖,以避免導致 DML 邏輯失效。能使用的複寫技術有限:
可用性群組:完全支援
變更資料擷取與變更追蹤:僅支援於目前表格
快照集與異動複寫:僅支援未啟用時態的單一發行者,以及已啟用時態的單一訂閱者。 不支援使用多位訂閱者,因為這可能會由於對本機系統時鐘的依賴,而導致不一致的時態性資料。 在此情況下,發布者負責線上交易處理(OLTP)工作負載,而訂閱者則負責卸載報告(包括
AS OF查詢)。 當分配代理開始時,會開啟一筆交易,該交易會被保留直到分配代理停止。ValidFrom和ValidTo會填入為散發代理程式所啟動之第一筆交易的開始時間。 如果應用程式或組織很重視ValidFrom和ValidTo所填入的時間接近目前的系統時間,則散發代理程式採用按照排程執行,而不是採用預設的持續執行方式,可能會比較理想。 如需詳細資訊,請參閱時態表使用案例。合併複製:不支援時序資料表
一般查詢只會影響目前資料表中的資料。 若要查詢歷程記錄資料表中的資料,您必須使用時態查詢。 如需詳細資訊,請參閱<查詢系統建立版本時態表中的資料>。
最佳索引策略包括在目前資料表上使用叢集欄位儲存索引或 B 樹列儲存索引,以及歷史資料表上的叢集欄位儲存索引,以達到最佳儲存大小與效能。 如果你建立或使用自己的歷程資料表,請建立這類由期間欄位所組成,並以期末欄位為起始的索引。 此索引加速了時間查詢及資料一致性檢查的查詢。 預設的歷史資料表會根據週期欄位(結束、開始)建立一個叢集式列存索引。 至少應使用非叢集列存放索引。
建立記錄資料表時,下列物件/屬性不會從目前的資料表複寫到記錄資料表:
- 期間定義
- 身份定義
- Indexes
- 統計資料
- 查看約束條件
- Triggers
- 分區配置
- 許可
- 資料列層級安全性述詞條件
你不能把歷史表設定成一串歷史表中的當前資料表。
Note
文件通常會使用「B 型樹狀結構」一詞來指稱索引。 在資料列存放區索引中,資料庫引擎會實作 B+ 樹狀結構。 這不適用於列存儲索引或記憶體最佳化資料表上的索引。 如需詳細資訊,請參閱 SQL Server 和 Azure SQL 索引架構和設計指南。