時態表考量與限制

適用於: SQL Server 2016 (13.x) 和更新版本 Azure SQL DatabaseAzure SQL 受控執行個體Microsoft Fabric 中的 SQL 資料庫

在使用時序表時,請注意以下因系統版本控制特性而產生的限制與考量:

  • 時序表必須定義主鍵,以將當前資料表與歷史資料表之間的紀錄對應。 歷程資料表不能定義主索引鍵。

  • 記錄 SYSTEM_TIMEValidFrom 值所用的 ValidTo 期間資料行,必須使用 datetime2 的資料類型加以定義。

  • 時間語法適用於資料庫中儲存在本機的資料表或檢視。 對於連結伺服器上的資料表或外部資料表等遠端物件,您無法直接在查詢中使用 FOR 子句或期間謂詞。

  • 若在建立歷程記錄資料表時指定歷程記錄資料表名稱,則您必須指定結構描述和資料表名稱。

  • 根據預設,歷程記錄資料表會採 PAGE 壓縮處理。

  • 如果目前的資料表是分割的,歷史資料表會在預設檔案群組上建立,因為分割設定不會自動從目前資料表複製到歷史資料表。

  • 時態表和歷程記錄資料表都無法使用 FileTable 或 FILESTREAM。 FileTable 和 FILESTREAM 允許 SQL Server 外部的資料操作,因此無法保證系統版本設定。

  • 節點或邊緣資料表無法建立成或變更為時態表。

  • 時態表支援 Blob 資料類型 (例如 (n)varchar(max)varbinary(max)(n)textimage),但會產生龐大的儲存成本,且其大小會影響效能。 在設計系統時,使用這些資料類型時要小心。

  • 歷程記錄資料表必須建立於與目前資料表相同的資料庫中。 不支援透過連結伺服器的時態查詢。

  • 歷程記錄資料表不能包含限制條件(主鍵、外鍵、資料表限制條件或資料行限制條件)。

  • 不支援在時態查詢 (使用 FOR SYSTEM_TIME 子句的查詢) 之上建立索引檢視。

  • 在系統版本設定時態表中,Online 選項 (WITH (ONLINE = ON) 並不會影響 ALTER TABLE ALTER COLUMN。 無論為 ALTER 選項指定哪一個值,ONLINE 資料行都不會以線上作業方式執行。

  • INSERTUPDATE 陳述式無法參考 SYSTEM_TIME 期間資料行。 若嘗試將值直接插入這些資料行,則會遭到系統封鎖。

  • TRUNCATE TABLESYSTEM_VERSIONING 時,不支援 ON

  • 不允許直接修改歷程記錄資料表中的資料。

  • 為避免使資料操作語言(DML)邏輯失效,目前資料表和歷史資料表都不允許使用 INSTEAD OF 觸發程序。 AFTER 觸發程序僅允許用於目前的資料表。 這些觸發程序在歷程記錄資料表上會遭到封鎖,以避免導致 DML 邏輯失效。

  • 能使用的複寫技術有限:

    • 可用性群組:完全支援

    • 變更資料擷取與變更追蹤:僅支援於目前表格

    • 快照集與異動複寫:僅支援未啟用時態的單一發行者,以及已啟用時態的單一訂閱者。 不支援使用多位訂閱者,因為這可能會由於對本機系統時鐘的依賴,而導致不一致的時態性資料。 在此情況下,發布者負責線上交易處理(OLTP)工作負載,而訂閱者則負責卸載報告(包括 AS OF 查詢)。 當分配代理開始時,會開啟一筆交易,該交易會被保留直到分配代理停止。 ValidFromValidTo 會填入為散發代理程式所啟動之第一筆交易的開始時間。 如果應用程式或組織很重視 ValidFromValidTo 所填入的時間接近目前的系統時間,則散發代理程式採用按照排程執行,而不是採用預設的持續執行方式,可能會比較理想。 如需詳細資訊,請參閱時態表使用案例

    • 合併複製:不支援時序資料表

  • 一般查詢只會影響目前資料表中的資料。 若要查詢歷程記錄資料表中的資料,您必須使用時態查詢。 如需詳細資訊,請參閱<查詢系統建立版本時態表中的資料>。

  • 最佳索引策略包括在目前資料表上使用叢集欄位儲存索引或 B 樹列儲存索引,以及歷史資料表上的叢集欄位儲存索引,以達到最佳儲存大小與效能。 如果你建立或使用自己的歷程資料表,請建立這類由期間欄位所組成,並以期末欄位為起始的索引。 此索引加速了時間查詢及資料一致性檢查的查詢。 預設的歷史資料表會根據週期欄位(結束、開始)建立一個叢集式列存索引。 至少應使用非叢集列存放索引。

  • 建立記錄資料表時,下列物件/屬性不會從目前的資料表複寫到記錄資料表:

    • 期間定義
    • 身份定義
    • Indexes
    • 統計資料
    • 查看約束條件
    • Triggers
    • 分區配置
    • 許可
    • 資料列層級安全性述詞條件
  • 你不能把歷史表設定成一串歷史表中的當前資料表。

Note

文件通常會使用「B 型樹狀結構」一詞來指稱索引。 在資料列存放區索引中,資料庫引擎會實作 B+ 樹狀結構。 這不適用於列存儲索引或記憶體最佳化資料表上的索引。 如需詳細資訊,請參閱 SQL Server 和 Azure SQL 索引架構和設計指南