SQL Server 2016 の Temporal Table と Stretch Database は組み合わせることが可能です。
組み合わせることで、
- Temporal Table の履歴テーブルを Stretch Database により SQL Database に格納する
というようなことができます。
Stretch Database
Stretch Database の概要
設定までの流れを軽く見ていきたいと思います。
なお、今回は SQL Server 2016 RC1 を使用していますが、RC1 の Stretch Databas は RC0 とは異なり、SQL Server Stretch Database が使用されるのがデフォルトの動作となっています。
SQL Server 2016 に Stretch Database が設定されている状態にしています。
はじめに Temporal Table の設定を行います。
-- 履歴用テーブルの作成 CREATE TABLE TemporalTableHistory( Col1 int NOT NULL, Col2 varbinary(8), Col3 varbinary(8), Col4 nvarchar(10), SysStartTime datetime2 NOT NULL, SysEndTime datetime2 NOT NULL ) GO -- ベーステーブルの作成 CREATE TABLE TemporalTable( Col1 int IDENTITY PRIMARY KEY CLUSTERED, Col2 varbinary(8), Col3 varbinary(8), Col4 nvarchar(10), SysStartTime datetime2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL , SysEndTime datetime2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL , PERIOD FOR SYSTEM_TIME (SysStartTime,SysEndTime) ) WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.TemporalTableHistory)) GO
この状態で、履歴テーブルを Stretch Table に設定します。
現状、GUI からは設定できないようですのでクエリで設定をしています。
ALTER TABLE [dbo].[TemporalTableHistory] SET(REMOTE_DATA_ARCHIVE = ON (MIGRATION_STATE = OUTBOUND))
これでテーブルの構造は準備できましたので、テスト用のデータを投入してみます。
-- テストデータの確認 INSERT INTO TemporalTable (Col2, Col3, Col4) VALUES(NEWID(), NEWID(), N'AAAAAA'), (NEWID(), NEWID(), N'AAAAAA'), (NEWID(), NEWID(), N'AAAAAA'), (NEWID(), NEWID(), N'AAAAAA') WAITFOR DELAY '00:00:01' BEGIN TRAN INSERT INTO TemporalTable (Col2, Col3, Col4) VALUES (NEWID(), NEWID(), N'AAAAAA') INSERT INTO TemporalTable (Col2, Col3, Col4) VALUES (NEWID(), NEWID(), N'AAAAAA') COMMIT TRAN WAITFOR DELAY '00:00:01' BEGIN TRAN INSERT INTO TemporalTable (Col2, Col3, Col4) VALUES (NEWID(), NEWID(), N'AAAAAA') INSERT INTO TemporalTable (Col2, Col3, Col4) VALUES (NEWID(), NEWID(), N'AAAAAA') COMMIT TRAN WAITFOR DELAY '00:00:01' -- データの変更 UPDATE [dbo].[TemporalTable] SET Col4 = 'BBBBBB' WHERE Col1 BETWEEN 3 AND 5
全期間のデータを検索した場合の、実行プランが以下になります。
- ベーステーブル
- 履歴テーブル
- Remote Query
の 3 テーブルに対して、検索が実行されていることが確認できますね。
テーブルの構造としては以下のような形となっています。
今回は履歴テーブルはフィルターしていませんが、フィルターしたものを SQL Database 側に連携するというような構造もどれるかもしれないですね。