Cross-Database Queries in Azure SQL Database / Azure SQL Database でデータベース間のクエリが可能に でアナウンスがされましたが、SQL Database で他 DB に対しての検索ができるようになりました。
Polybase や、Elastic Database Query で使用している外部データソース (EXTERNAL DATA SOURCE) を使用して、他の SQL Database に接続をし、リモートクエリが実行できるようになっています。
関連する情報としては、冒頭で紹介したもののほかに、以下も参考になります。
Azure SQL Database エラスティック データベース クエリ (プレビュー) の概要
CREATE DATABASE SCOPED CREDENTIAL (Transact-SQL)
CREATE EXTERNAL DATA SOURCE (Transact-SQL)
CREATE EXTERNAL TABLE (Transact-SQL)
手順としては、以下の作業を実施します。
- マスターキーの作成
- データベーススコープの資格情報の作成
- 外部データソースの作成
- 外部テーブルの作成
今回は、以下の環境で「SampleDB」から「SampleDB2」に対してクエリを実行してみます。
今回は同一のサーバーに配置していますが、異なるサーバーのデータベースに対してもクエリの実行は可能です。
「SampleDB2」には、以下のクエリでテーブルが作成済みです。
CREATE TABLE [dbo].[zipcode]( [zc_id] int NOT NULL, [zc_cityname] nvarchar(256) NULL, [zc_zipcode] nvarchar(20) NULL, [zc_country] nvarchar(5) NULL ) INSERT INTO zipcode(zc_id) VALUES(1),(2),(3),(4),(5)
最初に資格情報を作成するためにマスターキーを作成します。
TDE 等でマスターキーを作成している場合は、マスターキーの作成は不要です。
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'M@sterEr0s' GO
マスターキーを作成したら、次にデータベーススコープの資格情報を作成します。
この資格情報がデータベースのログインとして使用されますので、対象のデータベースにアクセスできる情報を設定します。
CREATE DATABASE SCOPED CREDENTIAL [<資格情報名>] WITH IDENTITY='<ログイン名>', SECRET='<パスワード>' GO
資格情報が作成できたら、その資格情報を使用して、外部データソースに接続をするための設定を行います。
他 DB の接続用として「TYPE=RDBMS」がサポートされたようです。
CREATE EXTERNAL DATA SOURCE SampleDB2 WITH ( TYPE=RDBMS, LOCATION='<サーバー名>.database.windows.net', DATABASE_NAME='SampleDB2', CREDENTIAL= <資格情報名>] );
最後に外部データソースを使用して、外部テーブルを作成します。
CREATE EXTERNAL TABLE [dbo].[zipcode]( [zc_id] int NOT NULL, [zc_cityname] nvarchar(256) NULL, [zc_zipcode] nvarchar(20) NULL, [zc_country] nvarchar(5) NULL ) WITH ( DATA_SOURCE = SampleDB2 );
これで準備は完了です。
外部テーブルは現状、検索のみが可能なようですので、以下のようなクエリを実行するとエラーとなります。
メッセージ 46519、レベル 16、状態 16、行 86
DML Operations are not supported with external tables.
INSERT INTO zipcode(zc_id) VALUES(6),(7),(8),(9),(10) UPDATE zipcode SET zc_cityname = N'財閥' where zc_id = 1
検索については単一テーブルの検索は当然できますが、自 DB 内のテーブルとの結合も可能です。
DECLARE @tmp TABLE(c1 int,c2 uniqueidentifier) INSERT INTO @tmp VALUES(1,NEWID()),(2,NEWID()),(3,NEWID()),(4,NEWID()),(5,NEWID()),(6,NEWID()) SELECT * FROM @tmp LEFT JOIN zipcode ON c1 = zc_id
クエリについては「Remot Query」として実行されています。
軽く使ってみた感じでは、まれに、3 分程度クエリの実行にかかるようなことがありましたので、OLTP のような即時に結果を返すような仕組みで使うのは難しいのかもしれないですね。
現状の動作として、初回のリモートへのアクセス時に最大 1 分程度かかる場合があるそうで、これが処理に影響を与えていたのかと思います。
時間の短縮の改善については積極的に取り込まれているということですので、これがショートトランザクションでも問題なく利用できるかもしれないですね。
# 初回以外はそれなりのアクセス速度だったので、サーバー内での初回アクセスを通常の処理以外で定期的に実行すればよいだけかも知れませんが。。
今回のアップデートで、クエリの実行先に幅が増えたのはよいですね。
[…] EXTERNAL DATA SOURCE を作るまでは、こちらもSEの雑記 「SQL Database で他 DB に対しての検索が可能になりました」を参考にCREDENTIAL を作り […]
Azure SQL Database の Elastic Database で クエリのリモート実行 | たんたか
24 9月 16 at 00:03
エラスティッククエリは未だにプレビューのようですが、
「SQL Database で他 DB に対しての検索」に関してはサポートされていると捉えて良いのでしょうか。
調査の仕方が悪いとは思うのですが、GAなのか判断が難しく、困っています。
もし、「ここを見れば分かるよ」というのが有れば紹介して頂けると助かります。
sakuma
26 6月 17 at 15:36