時態表考量與限制
適用於:SQL Server 2016 (13.x) 和更新版本 Azure SQL 資料庫 Azure SQL 受控執行個體
使用時態表時由於系統版本性質使然,因此需要瞭解某些考量與限制:
時態表必須具有定義的主索引鍵,以將目前資料表與歷程記錄資料表的記錄相互關聯。 歷程記錄資料表不可具有定義的主索引鍵。
記錄
ValidFrom
和ValidTo
值所用的SYSTEM_TIME
期間資料行,必須使用 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
。 無論針對ONLINE
選項指定何值,都不會以線上作業方式執行ALTER
資料行。INSERT
和UPDATE
陳述式無法參考SYSTEM_TIME
期間資料行。 若嘗試將值直接插入這些資料行,則會遭到系統封鎖。當
SYSTEM_VERSIONING
為ON
時,不支援TRUNCATE TABLE
。不允許直接修改歷程記錄資料表中的資料。
ON DELETE CASCADE
和ON UPDATE CASCADE
不得位於目前資料表。 換言之,若時態表參考外部索引鍵關係中的資料表 (對應至sys.foreign_key
中的parent_object_id
),則不允許CASCADE
選項。 若要解決此限制,請使用應用程式邏輯或 after 觸發程序,以維持在主索引鍵資料表執行刪除的一致性 (對應至sys.foreign_key
中的referenced_object_id
)。 若主索引鍵資料表屬於時態性,而且參考資料表屬於非時態性,則沒有這類限制。
目前或歷程記錄資料表不允許使用
INSTEAD OF
觸發程序,以避免使 DML 邏輯無效。AFTER
觸發程序僅允許針對目前的資料表使用。 這些觸發程序在歷程記錄資料表上會遭到封鎖,以避免導致 DML 邏輯失效。能使用的複寫技術有限:
可用性群組:完全支援
異動資料擷取和變更資料追蹤︰ 僅支援目前的資料表
快照集與異動複寫:僅支援未啟用時態的單一發行者,以及已啟用時態的單一訂閱者。 不支援使用多位訂閱者,因為這可能會由於對本機系統時鐘的依賴,而導致不一致的時態性資料。 在此情況下,當訂閱者執行卸載報表時會針對 OLTP 工作負載使用發行者 (包括
AS OF
查詢)。 當散發代理程式啟動時,其會開啟在散發代理程式停止之前皆保持開啟的交易。ValidFrom
與ValidTo
會填入散發代理程式開始進行第一筆交易的開始時間。 如果ValidFrom
和ValidTo
填入與目前系統時間接近的時間對於應用程式或組織來說很重要,則最好是依排程執行散發代理程式,而非依預設行為持續地執行散發代理程式。 如需詳細資訊,請參閱時態表使用案例。合併式複寫: 不支援時態表
一般查詢只會影響目前資料表中的資料。 若要查詢歷程記錄資料表中的資料,您必須使用時態查詢。 如需詳細資訊,請參閱<查詢系統建立版本時態表中的資料>。
最佳的索引策略,是在目前的資料表上加入叢集資料行存放區索引和/或 B 型樹狀結構資料列存放區索引,以及在歷程記錄資料表上加入叢集資料行存放區索引,藉以取得最佳儲存大小和效能。 若您建立/使用專屬的歷程記錄資料表,強烈建議您建立由期間資料行組成的索引類型,其會以期間資料行結尾開頭。 此索引可加速時態性查詢,並可加速屬於資料一致性檢查作業的查詢。 預設的歷程記錄資料表已根據期間資料行 (結尾、開頭),為您建立叢集資料列存放區索引。 建議您至少使用非叢集資料列存放區索引。
建立記錄資料表時,下列物件/屬性不會從目前的資料表複寫到記錄資料表:
- 期間定義
- 識別定義
- 索引
- 統計資料
- 檢查條件約束
- 觸發程序
- 資料分割設定
- 權限
- 資料列層級安全性述詞
歷程記錄資料表不可設定為一連串歷程記錄資料表中的目前資料表。
注意
文件通常會使用「B 型樹狀結構」一詞來指稱索引。 在資料列存放區索引中,資料庫引擎會實作 B 型樹狀結構。 這不適用於資料行存放區索引或經記憶體最佳化的資料表。 如需詳細資訊,請參閱 SQL Server 和 Azure SQL 索引架構和設計指南。