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 側に連携するというような構造もどれるかもしれないですね。

Share

Written by Masayuki.Ozawa

3月 21st, 2016 at 4:11 pm

Leave a Reply