SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

SQL Server 2016 で Temporal Table と Stretch Database を組み合わせて使用する

leave a comment

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 からは設定できないようですのでクエリで設定をしています。

image

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 テーブルに対して、検索が実行されていることが確認できますね。

image

テーブルの構造としては以下のような形となっています。

image

今回は履歴テーブルはフィルターしていませんが、フィルターしたものを SQL Database 側に連携するというような構造もどれるかもしれないですね。

Written by masayuki.ozawa

3月 21st, 2016 at 4:11 pm

Leave a Reply

*