テンポラルテーブルの考慮事項と制約

対象者:SQL Server 2016 (13.x) およびそれ以降のバージョン Azure SQL DatabaseAzure SQL Managed InstanceSQL Database in Microsoft Fabric

時間テーブルを扱う際には、システムのバージョン管理の性質上、以下の考慮点と制限事項に注意してください。

  • 時空テーブルには、現在のテーブルと履歴テーブル間のレコードを相関させるためにプライマリキーが定義されている必要があります。 履歴テーブルに主キーを定義することはできません。

  • SYSTEM_TIMEValidFrom の値を記録するために使用する ValidTo 期間列は、データ型 datetime2 を使用して定義する必要があります。

  • テンポラル構文は、データベースにローカルに格納されているテーブルまたはビューに対して機能します。 リンク サーバー上のテーブルや外部テーブルなどのリモート オブジェクトである場合は、クエリ内で FOR 句または期間述語を直接使用することはできません。

  • 履歴テーブルの作成時に履歴テーブルの名前を指定すると場合、は、スキーマとテーブルの名前を指定する必要があります。

  • 履歴テーブルは既定で PAGE 圧縮されています。

  • 現在のテーブルがパーティション分割されている場合、履歴テーブルはデフォルトのファイルグループで作成されます。なぜなら、パーティション設定が現在のテーブルから履歴テーブルに自動的に複製されないからです。

  • テンポラル テーブルと履歴テーブルでは、FileTable または FILESTREAM を使用できません。 FileTable と FILESTREAM を使用すると、SQL Serverの外部でデータを操作できるため、システムのバージョン管理は保証できません。

  • ノードテーブルまたはエッジテーブルはテンポラルテーブルとして作成も変更もできません。

  • テンポラル テーブルでは、(n)varchar(max)varbinary(max)(n)textimage などの BLOB データ型がサポートされていますが、これらは多大なストレージ コストを発生させ、サイズが多いためにパフォーマンスに影響を与えます。 システムを設計する際は、これらのデータ型を使う際には注意が必要です。

  • 履歴テーブルは、現在のテーブルと同じデータベースで作成する必要があります。 リンク サーバーに対するテンポラル クエリはサポートされていません。

  • 履歴テーブルには、制約 (主キー、外部キー、テーブル、または列の制約) を含めることはできません。

  • テンポラル クエリ (FOR SYSTEM_TIME 句を使うクエリ) 上では、インデックス付きビューはサポートされていません。

  • システムでバージョン管理されたテンポラル テーブルでは、オンライン オプション (WITH (ONLINE = ON) は ALTER TABLE ALTER COLUMN に影響を与えません。 ALTER オプションに指定された値に関係なく、ONLINE 列はオンライン操作としては実行されません。

  • INSERT および UPDATE ステートメントでは、SYSTEM_TIME 期間列を参照できません。 これらの列に値を直接挿入しようとすると、ブロックされます。

  • TRUNCATE TABLE はサポートされませんが、SYSTEM_VERSIONINGON です。

  • 履歴テーブルのデータを直接変更することはできません。

  • データ操作言語(DML)ロジックを無効化しないよう、 INSTEAD OF トリガーは現在テーブルにも履歴テーブルにも許可されていません。 AFTER トリガーは、現在のテーブルでのみ許可されます。 DML ロジックが無効になるのを防ぐために、これらのトリガーは履歴テーブルではブロックされます。

  • レプリケーション テクノロジの使用量は制限されています。

    • 可用性グループ:完全サポート

    • 変更データのキャプチャおよび変更追跡:現在のテーブルでのみサポートされています

    • スナップショットおよびトランザクション レプリケーション: 1 つのパブリッシャー (テンポラルが有効化されない)、および 1 つのサブスクライバー (テンポラルが有効化される) でのみサポートされます。 複数のサブスクライバーの使用は、ローカル システム クロックへの依存によりテンポラル データの一貫性が失われる可能性があるため、サポートされていません。 この場合、パブリッシャーはオンライントランザクション処理(OLTP)のワークロードに使用され、サブスクライバーはレポートのオフロード( AS OF クエリを含む)を担当します。 配電エージェントが開始すると、取引が開かれ、配電エージェントが停止するまでその取引が開かれます。 ValidFrom ValidToは、ディストリビューションエージェントが最初に開始したトランザクションの開始時刻まで入力されます。 ValidFromValidTo が現在のシステム時刻に近い時刻に設定されていることが、アプリケーションまたは組織にとって重要な場合、ディストリビューション エージェントは、継続的に実行する既定の動作ではなく、スケジュールに従って実行することをお勧めします。 詳細については、「テンポラル テーブルの使用シナリオ」を参照してください。

    • マージレプリケーション:時空テーブルには対応していません

  • 定期的なクエリは、現在のテーブルのデータにのみ影響を与えます。 履歴テーブルのデータに対してクエリを実行するには、テンポラル クエリを使用する必要があります。 詳細については、「システム バージョン管理されたテンポラル テーブル内のデータに対してクエリを実行する」を参照してください。

  • 最適なインデックス戦略としては、現在のテーブルにクラスタ化されたカラムストアインデックスまたはBツリー行ストアインデックスを、履歴テーブルにクラスタ化されたカラムストアインデックスを配置し、最適なストレージサイズとパフォーマンスを実現します。 独自の履歴テーブルを作成または使用する場合は、終了期間列を先頭とする期間列で構成されたこのタイプのインデックスを作成してください。 このインデックスは時間的クエリやデータ整合性チェックの一部となるクエリを高速化します。 デフォルトの履歴テーブルは、期間列(終了、開始)に基づいてクラスタ化された行ストアインデックスを作成します。 最低限、クラスタ化されていないRowstoreインデックスを使いましょう。

  • 次のオブジェクト/プロパティは、履歴テーブルの作成時に、現在のテーブルから履歴テーブルにレプリケートされません。

    • 期間の定義
    • ID の定義
    • Indexes
    • Statistics
    • 制約を確認する
    • トリガー
    • パーティション設定構成
    • Permissions
    • 行レベルのセキュリティ述語
  • 履歴テーブルを履歴テーブルの連鎖の中で現在のテーブルとして設定することはできません。

Note

ドキュメントでは、一般的にインデックスに関して B ツリーという用語が使用されます。 行ストア インデックスで、データベース エンジンによって B+ ツリーが実装されます。 これは、列ストア インデックスやメモリ最適化テーブルのインデックスには適用されません。 詳細については、「SQL Server と Azure SQL のインデックスのアーキテクチャとデザイン ガイド」を参照してください。