Synapse SQLプールのスペックと３層構造の検証

Synapse SQLプールのスペックとノード、ディストリビューションについての検証したのでまとめました。

#３層構造のアーキテクチャ
Synapse SQLプールは３層構造のアーキテクチャとなっています。

* 制御ノード（コントロールノード）
接続やMPPエンジンにおける並列クエリの最適化の調整をするノード。（１台で構成されます。）

* 計算ノード（コンピュートノード）
実際に処理が実行されるノード。1つのSynapse SQLプールに1台以上で構成されます。
また、1つのコンピュートノードに1つ以上のディストリビューションが紐づきます。

* ストレージ（ディストリビューション）
実際のデータが格納されており60台で構成されます。各ディストリビューションは1つのコンピュートノードに紐づきます。
それぞれのディストリビューションが複数のコンピュートノードで共有されることはありません。

また、Synapse SQLプールはスペックを「cDWU」という単位で指定し、DW100c~DW30000cまでの間で指定可能です。
今回はこの「cDWU」と上記の3層構造の関係を検証しました。

#cDWUを大きくしても、コントロールノードは１台、ディストリビューションは60個
前提の知識といたしまして、Synapse SQLプールではcDWUをどれだけ大きくしても、コントロールノードは１台で構成され、ディストリビューションは60個で構成されます。
cDWUに合わせて変化が起きるのは、コンピュートノードのスペックや台数となります。

#検証
###cDWUの変更
cDWUの変更はAzureポータル、Powershellなどから行えますが、今回はT-SQLにて以下のコマンドで実行しました。
それぞれのcDWUとコンピュートノードの関係を確認していきます。
※すべてmasterデータベースで実行してください。

```SQL
ALTER DATABASE "＜SQLプール名＞"
MODIFY (SERVICE_OBJECTIVE = 'DW＜指定のcDWU＞c');
```

変更状態の確認は以下のコマンドで確認可能です。

```SQL
SELECT
    *
FROM      sys.dm_operation_status
WHERE     resource_type_desc = 'Database'
AND       major_resource_id = '＜SQLプール名＞';
```

現在のcDWUの確認は以下で行います。

```SQL
SELECT
	 db.name [Database]
	,ds.edition [Edition]
	,ds.service_objective [Service Objective]
FROM
	sys.database_service_objectives   AS ds
JOIN
	sys.databases                     AS db ON ds.database_id = db.database_id
WHERE
	ds.edition='DataWarehouse';
```

###DW100c~DW500cはコンピュートノードは１台
コンピュートノードの確認は以下のコマンドで確認できます。(SQLプールで実行してください。)

```SQL
select
	*
from sys.dm_pdw_nodes node
left join sys.dm_pdw_nodes_os_sys_info sysinfo
	on node.pdw_node_id=sysinfo.pdw_node_id;
```

DW100cで上記のコマンドで確認を行うと結果は以下の通りとなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/6a05ee1d-894a-6e22-ee45-f69a973703b4.png)
DW100cの場合はコントロールノード1台、コンピュートノード1台で構成されている事がわかります。

また、以下のコマンドで各コンピュートノードにいくつのディストリビューションが紐づいているか確認できます。

```SQL
select
	pdw_node_id,
	count(*) cnt
from sys.pdw_distributions
group by pdw_node_id;
```

結果は以下の通り、１つのコンピュートノードに60すべてのディストリビューションが紐づきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/58b37377-fb18-8b49-c287-f72a2a1f64b6.png)

DW100c~DW500cまで同様に確認を行っていきましたが、この構成は変わりませんでした。
一方で`dm_pdw_nodes_os_sys_info`テーブルの`committed_target_kb`や`max_workers_count`が以下のように変化したため、コンピュートノード１台であっても処理能力が向上している事が推察されます。

|cDWU|committed_target_kb|max_workers_count|
|:---|---:|--:|
|DW100c|58646024|1843|
|DW200c|127515528|3686|
|DW300c|195830648|5529|
|DW400c|262173528|7372|
|DW500c|341075896|9216|



###DW1000c以降はDW500c毎に1台ずつコンピュートノードが追加される
DW100cからDW500cまではコントロールノード１台、コンピュートノード１台、ディストリビューション60の構成でコンピュートノードのスペックが変わっていました。
一方、DW1000c以降はDW500c毎に1台ずつコンピュートノードが追加されるようです。

以下DW1000cの時のノードの状態です。（コンピュートが2台確認できます。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/617f4b48-9c44-1e6e-1300-4a1bcdb804a1.png)


以下DW1500cの時のノードの状態です。（コンピュートが3台確認できます。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/f2c76b50-6f78-0e80-e7ed-0f084e53156d.png)

また、60のディストリビューションは以下の通り、DW1000cであれば２つのコンピュートノードそれぞれに30ずつ、DW1500cであれば３つのコンピュートそれぞれに20ずつ割り当てられました。

|cDWU|compute node数|ディストリビューション/compute node|
|:---|---:|--:|
|DW1000c|2|30|
|DW1500c|3|20|

この為、おそらく最大のDW30000cの場合には、60台のコンピュートノードそれぞれに１つのディストリビューションが紐づく事になるかと思います。


##まとめ
DW100c~DW500cまでは1つのコンピュートノードのスペックにより処理性能が変わる。
DW1000c以降はDW500cにつき、コンピュートノードが1台追加され、台数に応じて処理性能がかわる。
60のディストリビューションは、割り当てられているコンピュートノードに均等に割り当てられる。（コンピュートが2台の場合は30ずつ、コンピュートが3台の場合は20ずつ）