Azure Synapse Link for SQL DB を試す

# Azure Synapse Link for SQL DB を試す

## はじめに

Build2022で発表されたAzure Synapse Link for SQL DBを試してみます。
Azure SQL DBに対してNoETLでDWHに連携する機能です。

[Build](https://mybuild.microsoft.com/ja-JP/home)

### 参考リンク

[Azure Synapse Link for SQL とは (プレビュー)](https://docs.microsoft.com/ja-jp/azure/synapse-analytics/synapse-link/sql-synapse-link-overview)

[Azure SQL Database 用 Azure Synapse Link (プレビュー)](https://docs.microsoft.com/ja-jp/azure/synapse-analytics/synapse-link/sql-database-synapse-link)

[Azure Synapse Link for Azure SQL Database (プレビュー) の構成](https://docs.microsoft.com/ja-jp/azure/synapse-analytics/synapse-link/connect-synapse-link-sql-database)


## 手順

### 準備

#### Synapse workspace 作成

synapse を作成します。
1.[Synapse ワークスペースの作成](https://docs.microsoft.com/ja-jp/azure/synapse-analytics/get-started-create-workspace) を参考にSynapse workspaceを作成します

設定全体
![2022-05-25-07-27-34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/f9765d7b-b58e-bb6e-bcff-e0057c081c2e.png)


2.SQL Poolを作成します。

![2022-05-25-08-21-48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/d1b35af5-d0f7-406c-2abd-1c7e84b2ed5d.png)


#### SQL DB作成

1.Azure Portalから論理SQL Serverを作成します。

![2022-05-25-07-41-24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/5ef8245c-6660-d8a5-8cb3-acb0c7197c1f.png)


設定全体

![2022-05-25-07-54-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/b5aaa4c1-e53f-2e95-7efa-07c3c0d49198.png)

AD管理者の設定などをしています。
。

2.作成後は **ネットワークタブ** にて自身のクライアントIPを登録しておきます

![2022-05-25-08-03-37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/50cbf220-d18e-bca2-7ecf-db18bc72dbb0.png)


3.同様に **IDタブ** にてシステム割当マネージドIDを有効化しておきます。

![2022-05-25-08-04-26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/0c73f7ec-f285-f046-a96a-61771cde32de.png)


#### world wide importersの構成

 [world wide importers の作成](https://docs.microsoft.com/ja-jp/sql/samples/wide-world-importers-oltp-install-configure?view=sql-server-ver16#azure-sql-database)を参考にdbを構成します。

1.[wide-world-importers-release](https://github.com/Microsoft/sql-server-samples/releases/tag/wide-world-importers-v1.0)から対応バージョンのbakpacをダウンロードします。
2.SSMSからAD認証で対象sqlserverにログインし、データベースを右クリックして**データ層アプリケーションのインポート** を実行します。

![2022-05-25-08-00-53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/ac93417e-d58d-8d29-36f0-076f94cb66f2.png)

設定画面

![2022-05-25-08-06-59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/6012e49a-68d2-2ed0-a505-a54c74aff796.png)


3.インポートが完了したらSynapseリソースをSQL DBのdb_ownerに指定します。

```sql

CREATE USER <workspace name> FROM EXTERNAL PROVIDER;
ALTER ROLE [db_owner] ADD MEMBER <workspace name>;

```


### 1. Synapse Link for SQL DBの構成

1.統合ハブから　**リンク接続** を選択します。

![2022-05-25-08-18-29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/8e69307d-404f-96fe-9609-96a221635eed.png)


2.**リンク接続** から **新規** を選択します。

![2022-05-25-08-19-07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/7fe78fd3-a939-28b4-07c1-3f9081a7cda8.png)


3.準備で作成したDBを選択します。

![2022-05-25-08-20-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/8bfa37b5-4006-9f00-901c-0c356de4ea39.png)


4.ソーステーブルを選択します。


![2022-05-25-08-20-58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/a1d2a918-3750-97cf-6417-08b2d8fa7898.png)


確認画面

![2022-05-25-08-34-08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/0d9bc926-7235-ccba-c3a4-248d0725d799.png)


5.リンク接続を確認します。

![2022-05-25-08-34-38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/fdd14fcc-e1c7-3dcc-681e-6b0243826176.png)

6.リンクの構成画面で、警告を確認します。

![2022-05-25-08-37-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/7a961962-054a-80e3-6f32-abf6cffdfeb0.png)


7.対応外の型を含むのでHeapに変更します。

![2022-05-25-08-38-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/d635b0ee-a20c-357a-d6e5-a616c00dadda.png)


8.**発行** します。

![2022-05-25-08-38-51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/29dafbf4-5a8a-913d-1f67-e195e57a9dc6.png)


9.選択したテーブルのターゲットスキーマが存在する必要があるので、SQLPool上で作成しておきます

```sql

CREATE SCHEMA [Sales]

```

![2022-05-25-08-42-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/983d03ec-ca97-8753-880e-a9d873332878.png)


10.**開始** します。

![2022-05-25-08-39-22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/572df784-654f-b6c6-2afe-95f80f84b6f1.png)


11.数分経つと開始が完了します。

![2022-05-25-08-45-36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/a6378dc4-23ab-cd2f-6fcf-a51edb065ec3.png)


監視画面がReplecatingとなります。

![2022-05-25-09-52-59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/4e035f53-23db-9e95-dc60-c66bdaa31657.png)


### 2.データの確認

#### 開始直後

まずは、ソーステーブルの件数を見ておきます。

![2022-05-25-08-46-47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/498ca371-616d-3484-ef4f-98d10afa514b.png)



専用SQL Pool側も開始が完了しているので、同じ件数になっています。

![2022-05-25-08-47-35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/d51e5c54-141c-764d-097b-30fb6b480225.png)


#### データ増幅確認

以下のクエリで雑にデータを増幅します。

```sql

DECLARE @maxOrder int
DECLARE @count int
SELECT @maxOrder = max( [OrderID])
  FROM [Sales].[Orders]


INSERT INTO [Sales].[Orders]
SELECT TOP 10000 @maxOrder  + [OrderID]
      ,[CustomerID]
      ,[SalespersonPersonID]
      ,[PickedByPersonID]
      ,[ContactPersonID]
      ,[BackorderOrderID]
      ,[OrderDate]
      ,[ExpectedDeliveryDate]
      ,[CustomerPurchaseOrderNumber]
      ,[IsUndersupplyBackordered]
      ,[Comments]
      ,[DeliveryInstructions]
      ,[InternalComments]
      ,[PickingCompletedWhen]
      ,[LastEditedBy]
      ,[LastEditedWhen]
  FROM [Sales].[Orders]
  order by 1 

print N'INSERT件数:'+ convert(nvarchar,@@ROWCOUNT)

SELECT @count=COUNT(1) FROM [Sales].[Orders]

print N'結果件数:'+ convert(nvarchar,@count)

```

（generatorが動かなかった..)

データの挿入を実行します。

SQL DB側の結果
![2022-05-25-09-44-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/3b2c52ab-67ab-bf0f-7ad8-0ab7cdd460f6.png)



約1分後にはデータが同期されています※ここだけタイムゾーンに気づかずにやっているので+9時間読み替え必要

Synapse側の結果
![2022-05-25-09-44-47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/c1c8a6f3-d2e2-b33a-1e33-c0a4bb2e18d3.png)


```sql

DECLARE @count int 

SELECT @count=count(1)
 FROM [Sales].[Orders];

print N'時刻:' + convert(nvarchar,dateadd(hh,9,SYSDATETIME()))
print N'件数:'+ convert(nvarchar,@count)

```

増やすためにTop句を外してみます。

SQL DB側の結果
![2022-05-25-09-46-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/17cec02d-9be5-ba1d-d5f8-b4f34361baae.png)


これも即反映されています。

Synapse側の結果

![2022-05-25-09-48-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/f710de26-2509-5dea-a64b-3904c6e1095a.png)

何回か増幅させて、最終的に
600万件くらいになりましたが、3,4分くらいで反映されました。
(この辺になるとSQLDB側の生成に時間がかかるようになります)

SQL DB側の結果

![2022-05-25-10-17-25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/1d7291e7-fe47-cb94-22bb-e1f0e8cc40ef.png)


Synapse側の結果

![2022-05-25-10-20-44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/0501f440-b502-56e4-dced-76df3be09010.png)


## まとめ

SQLファミリーを利用されている方々はETL不要で分析環境にデータをエクスポートできるのでかなりいいんじゃないでしょうか。

このままでも運用DBに負荷をかけないまま分析クエリが効率化されると思いますが、
SQL Pool側でストアドプロシージャを組んで一定間隔で実行し、適切なモデリングや分散テーブルに整形するなどでニアリアルタイム分析もはかどりそうです。
外部テーブルと連携してデータレイクにオフロードするのもいいですね。

コスト面が気になるところです。

引き続きBuild2022 楽しんでいきましょう!