Azure Synapse Analytics SQLプールを高速にするリソースクラス

#Azure Synapse Analytics SQLプールのリソースクラス
Azure Synapse Analytics SQLプールではリソースクラスと言うものが存在しており、クエリの性能に大きく影響を与えます。
リソースクラスとはクエリのメモリ使用量、同時実行スロット数（コンカレンシースロット）を制御する機能になっており、**静的リソースクラス**と**動的リソースクラス**があります。

###静的リソースクラス
・cDWUの値（DW200cやDW1000cなど）にかかわらず、同じメモリ容量を割り当て
・同時実行が多く、データ量があまり変わらない（静的）である場合に有効

静的リソースクラス：
staticrc10 | staticrc20 | staticrc30 | 
staticrc40 | staticrc50 | staticrc60 | 
staticrc70 | staticrc80

###動的リソースクラス
・cDWUの値（DW200cやDW1000cなど）に応じてメモリ容量を割り当て
・cDWUの値が変わっても、同時実行数は変わらない
・データ量が増大で変化する場合に有効

デフォルトはsmallrc

動的リソースクラス：
smallrc | mediumrc | largerc | xlargerc

| サービス レベル | メモリ量(GB) | smallrc | mediumrc | largerc | xlargerc |
|:-:|:-:|:-:|:-:|:-:|:-:|
| DW100c | 60GB | 25%(15GB) | 25%(15GB) | 25%(15GB) | 70%(42GB) |
| DW200c | 120GB | 12.5%(15GB) | 12.5%(15GB) | 22%(26.4GB) | 70%(84GB) |
| DW300c | 180GB | 8%(14.4GB) | 10%(18GB) | 22%(39.6GB) | 70%(126GB) |
| DW400c | 240GB | 6.25%(15GB) | 10%(24GB) | 22%(52.8GB) | 70%(168GB) |
| DW500c | 300GB | 5%(15GB) | 10%(30GB) | 22%(66GB) | 70%(210GB) |
| DW1000c | 600GB | 3%(18GB) | 10%(60GB) | 22%(132GB) | 70%(420GB) |
| DW1000c からDW30000c | cDWU/100×60 | 3% | 10% | 22% | 70% |

##リソースクラスで管理される操作
リソースクラスで管理される操作は以下の通りです。
• INSERT-SELECT、UPDATE、DELETE
• SELECT (ユーザー テーブルのクエリを実行する場合)
• ALTER INDEX - REBUILD または REORGANIZE
• ALTER TABLE REBUILD
• CREATE INDEX
• CREATE CLUSTERED COLUMNSTORE INDEX
• CREATE TABLE AS SELECT (CTAS)
• データの読み込み
• Data Movement Service (DMS) によって実行されるデータ移動操作

より大きなリソースクラスを使用してクエリの実行を行うとそれだけ、多くのリソースが使われて高速に処理を行う事が出来ます。
一方でより多くのリソースを使うため、同時に実行できるクエリ数は減ります。（後述）

#同時クエリとコンカレンシースロット
Azure Synapse AnalyticsではcDWUの値に応じて、同時に実行できる同時クエリの数が決まっています。
また、メモリやCPUなどのリソースはコンカレンシースロットと言う単位で割り当てられます。

前述したリソースクラスは、各リソースクラスがどれだけのコンカレンシースロットを使用するのかが決まっているという事になります。

###同時クエリ
・同時に実行されるクエリの数
・各クエリの実行は、直列クエリ（単一スレッド）または並列クエリ（マルチスレッド）かどうかにかかわらず、１つのクエリとしてカウントされる

###コンカレンシースロット
・クエリ毎にコンピューティングリソースがコンカレンシースロットと言う単位で割り当てられる
・cDWU毎に最大コンカレンシースロット数は変化
・リソースクラス毎に必要なコンカレンシースロットが変化（後述）

| cDWU | 同時クエリの最大数 | 割り当てられるコンカレンシースロット数 | 
|:-:|:-:|:-:|
| DW100c | 4 | 4 | 
| DW200c | 8 | 8 | 
| DW300c | 12 | 12 | 
| DW400c | 16 | 16 | 
| DW500c | 20 | 20 | 
| DW1000c | 32 | 40 | 
| DW1500c | 32 | 60 | 
| DW2000c | 48 | 80 | 
| DW2500c | 48 | 100 | 
| DW3000c | 64 | 120 | 
| DW5000c | 64 | 200 | 
| DW6000c | 128 | 240 | 
| DW7500c | 128 | 300 | 
| DW10000c | 128 | 400 | 
| DW15000c | 128 | 600 | 
| DW30000c | 128 | 1200 | 

#リソースクラス毎の消費するコンカレンシースロット数
クエリ実行の際に、リソースクラス毎にコンカレンシースロットの消費数が変化します。
###静的リソースクラスと消費するコンカレンシースロット数

| cDWU | 同時クエリの最大数 | 割り当てられるコンカレンシー スロット数 | staticrc10  | staticrc20 | staticrc30 | staticrc40 | staticrc50| staticrc60| staticrc70 | staticrc80 | 
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| DW100c | 4 | 4 | 1 | 2 | 4 | 4 | 4 | 4 | 4 | 4 | 
| DW200c | 8 | 8 | 1 | 2 | 4 | 8 | 8 | 8 | 8 | 8 | 
| DW300c | 12 | 12 | 1 | 2 | 4 | 8 | 8 | 8 | 8 | 8 | 
| DW400c | 16 | 16 | 1 | 2 | 4 | 8 | 16 | 16 | 16 | 16 | 
| DW500c | 20 | 20 | 1 | 2 | 4 | 8 | 16 | 16 | 16 | 16 | 
| DW1000c | 32 | 40 | 1 | 2 | 4 | 8 | 16 | 32 | 32 | 32 | 
| DW1500c | 32 | 60 | 1 | 2 | 4 | 8 | 16 | 32 | 32 | 32 | 
| DW2000c | 48 | 80 | 1 | 2 | 4 | 8 | 16 | 32 | 64 | 64 | 
| DW2500c | 48 | 100 | 1 | 2 | 4 | 8 | 16 | 32 | 64 | 64 | 
| DW3000c | 64 | 120 | 1 | 2 | 4 | 8 | 16 | 32 | 64 | 64 | 
| DW5000c | 64 | 200 | 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128 | 
| DW6000c | 128 | 240 | 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128 | 
| DW7500c | 128 | 300 | 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128 | 
| DW10000c | 128 | 400 | 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128 | 
| DW15000c | 128 | 600 | 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128 | 
| DW30000c | 128 | 1200 | 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128 | 

###動的リソースクラスと消費するコンカレンシースロット数
| cDWU| 同時クエリの最大数 | 割り当てられるコンカレンシー スロット数 | smallrc | mediumrc | largerc  | xlargerc | 
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| DW100c | 4 | 4 | 1 | 1 | 1 | 2 |
| DW200c | 8 | 8 | 1 | 1 | 1 | 5 |
| DW300c | 12 | 12 | 1 | 1 | 2 | 8 |
| DW400c | 16 | 16 | 1 | 1 | 3 | 11 |
| DW500c | 20 | 20 | 1 | 2 | 4 | 14 |
| DW1000c | 32 | 40 | 1 | 4 | 8 | 28 |
| DW1500c | 32 | 60 | 1 | 6 | 13 | 42 |
| DW2000c | 32 | 80 | 2 | 8 | 17 | 56 |
| DW2500c | 32 | 100 | 3 | 10 | 22 | 70 |
| DW3000c | 32 | 120 | 3 | 12 | 26 | 84 |
| DW5000c | 32 | 200 | 6 | 20 | 44 | 140 |
| DW6000c | 32 | 240 | 7 | 24 | 52 | 168 |
| DW7500c | 32 | 300 | 9 | 30 | 66 | 210 |
| DW10000c | 32 | 400 | 12 | 40 | 88 | 280 | 
| DW15000c | 32 | 600 | 18 | 60 | 132 | 420 |
| DW30000c | 32 | 1200 | 36 | 120 | 264 | 840 |

#同時実行クエリとコンカレンシースロット数の考え方
DW1000cの時を想定して検討します。
DW1000cでは同時クエリの最大数は32、割り当てられるコンカレンシースロット数は40です。
この時すべてのクエリをデフォルトのsmallrc（消費スロット1）のみで実行した場合以下の通り、
コンカレンシースロットよりも先に、同時実行クエリ数に到達するので、32のクエリの同時実行が可能です。
※32以上のクエリは実行中のクエリが終了し、同時実行クエリに空きが出るまで待機します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/e77a2a52-3baf-799f-3962-34f9ffc0b8d6.png)

一方上記は全て、smallrcでクエリが実行されている事を想定していますが、一般的なシステムでは、様々なはリソースクラスが混在する事が一般的です。
上記と同様にDW1000c（同時クエリの最大数は32、割り当てられるコンカレンシースロット数は40）を想定します。
大量データのロード処理をxleargrc(消費スロット28)で1多重
サマリーテーブルの作成をmdeiumrc(消費スロット4)で2多重
BIでの検索をstaticrc20(消費スロット2)で2多重
で走行した場合、同時クエリの最大数よりも先に、コンカレンシースロットの数を使い果たす為、以降クエリが投げられた場合、コンカレンシースロットに空きが出るまで待機します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/f708b74c-8c7f-713c-92e1-bdb4da7b3c2b.png)

また、上記の場合の待機中のクエリですが、例えば、mediumrc(消費スロット4)とstaticrc20(消費スロット2)のクエリが待機している場合、mediumrc(消費スロット4)のクエリはコンカレンシースロットに空きが4つ出来るまで待機します。仮にコンカレンシースロットに空きが2つできた場合には、mediumrcのクエリより先に、staticrc20のクエリが実行されます。

#設定方法
xlargercuserと言うユーザを作成し、xlargercのリソースクラスを割り当てる例を記載します。
###①masterデータベースでxlargercのユーザを作成
masterデータベースにログインして以下のSQLを実行

```
--DBユーザー(xlargercuser)を作成
CREATE LOGIN xlargercuser WITH PASSWORD = '<パスワード>';
 
--masterデータベースにDBユーザー(xlargercuser)を追加
CREATE USER xlargercuser for LOGIN xlargercuser;
```

###②対象のAzure Synapse Analyticsにてユーザを追加し、xlargercのロールを付与
対象のAzure Synapse Analyticsにログインして以下のSQLを実行

```
--ユーザデータベースにDBユーザー(xlargercuser)を追加
CREATE USER xlargercuser for LOGIN xlargercuser;

--DBユーザー(xlargercuser)にCONTROL権限を付与
GRANT CONTROL ON DATABASE::"<ユーザーデータベース名>" to xlargercuser;

--DBユーザー(xlargercuser)にxlargercロールを付与
EXEC sp_addrolemember 'xlargerc', 'xlargercuser';
```

作成後、クエリを実行するとAzure Portalのクエリアクティビティなどから、以下の通りxlargercのリソースクラスで実行されている事を確認出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/b6d8b9c3-9377-03b3-d384-1e2092665f48.png)