SQL Server 2016 CTP 2.0 では、Stretch Database の機能が実装されており、データを SQL Database 上に拡張することができるようになっています。
この機能を少し試してみました。
詳細については、Stretch Database を参照してください。
少し触ってみた感じではいろいろと制約があり、この制約を理解して使わないと難しいかなというイメージを受けました。
現状は CTP 2.0 ですので、RTM 時にはいくつかは緩和しているかもしれませんが、詳細については Requirements and limitations for Stretch Database に記載されています。
Stretch Database を使用するためにはインスタンスレベルで機能を有効化する必要がありますので、最初に以下のクエリを実行して、機能の有効化を行います。
EXEC sp_configure 'remote data archive' , '1' RECONFIGURE GO
次に SQL Database との接続の設定を行います。
これについては GUI でもできるのですが、GUI では事前に証明書の設定等が必要になりますので SQL で実施してしまったほうが楽かなと思います。
CREATE CREDENTIAL [<サーバー名>.database.windows.net] WITH IDENTITY='<ログイン>', SECRET='<パスワード>' GO
これで、SQL Database との接続に使用する資格情報が設定できます。
ここまで終わったら事前準備は完了ですので、データベース単位で Stretch Database を有効にします。
有効には以下のようなクエリを実行します。
ALTER DATABASE <データベース名> SET REMOTE_DATA_ARCHIVE = ON (SERVER= N'<サーバー名>.database.windows.net')
ALTER DATABASE でデータベースに対して機能を有効にしたタイミングで、SQL Database に対してデータベースが作成されます。
SQL Database では S3 : 250GB のデータベースが作成されているようです。
これで、データベースレベルで設定が終わりましたので、最後にテーブルに対して有効にして、Stretch Table を作成します。
CREATE TABLE StretchTable (Col1 uniqueidentifier) ALTER TABLE StretchTable ENABLE REMOTE_DATA_ARCHIVE WITH ( MIGRATION_STATE = ON )
これで、SQL Database 側にストレッチ先のテーブルが作成されます。
以上で設定は完了です。
以下のようなクエリでデータを挿入すると、最初はローカルのテーブルに格納がされるのですが、少し時間を置くとデータが SQL Database 上に移行されています。
SET NOCOUNT ON INSERT INTO StretchTable VALUES(NEWID()) GO 100
SELECT * FROM sys.dm_db_partition_stats WHERE object_id = OBJECT_ID('StretchTable')
データを挿入した直後はローカルに格納されているのが「row_count」で確認ができますが、時間が経過するとデータが削減され、0になるのが確認できます。
しかし、
SELECT * FROM StretchTable
で検索を行うと、データが検索できることが確認できます。
これは、リモートクエリにより SQL Database に対して透過的に検索をしているために、このようなデータが取得できる形となっています。
内部的に「batchID」が追加されており、これでどのタイミングで移行されたデータなのかを識別できるようです。
データの格納状態については、sp_spaceused が拡張されており、以下のような情報取得が可能となっています。
sp_spaceused 'StretchTable', @mode='ALL' sp_spaceused 'StretchTable', @mode='LOCAL_ONLY' sp_spaceused 'StretchTable', @mode='REMOTE_ONLY'
使い方が難しいと感じた点としては、
UPDATE StretchTable SET Col1 = NEWID() WHERE Col1 = '195699A0-73C4-4F4D-9B1B-8A04547C4217' DELETE FROM StretchTable
のようなクエリを実行してみると、以下のようなエラーになる点です。
# Stretch Table に変更したタイミングで、トリガーが自動的に作成されます。
現状の制限として、
You can’t run UPDATE or DELETE operations on a Stretch-enabled table.
があるため、データの変更ができません。
# Truncate Table もできません。
ログを格納するようなテーブルで使用する用途なのでしょうかね。
また、Stretch Table はデータの連携を以下のように ON/OFF で一時停止/再開をすることができます。
ALTER TABLE StretchTable ENABLE REMOTE_DATA_ARCHIVE WITH ( MIGRATION_STATE = OFF ) ALTER TABLE StretchTable ENABLE REMOTE_DATA_ARCHIVE WITH ( MIGRATION_STATE = ON )
ただし、これらのクエリは一時的に停止をするもであるため、「無効」にするための設定ではありません。
Stretch Table を無効にするためにはテーブルを削除する必要があります。
手順としては以下のようになるのですが、テーブルを削除する必要があるため、データを今後も使用するためには、INSERT INTO ステートメントなどでテーブルのデータを退避させる必要がでてきます。
To disable Stretch for a table
- Pause data migration on the Stretch-enabled table. For more info, see Pause and resume Stretch.
- Create a new local table with the same schema as the Stretch-enabled table.
- Copy the data from the Stretch-enabled table into the new table by using an INSERT INTO … SELECT FROM statement.
- Drop the Stretch-enabled table.
- Rename the new table with the name of the Stretch-enabled table that you dropped.
使いどころについては十分に考慮する必要がありそうですね。