Snowflakeにおけるパフォーマンスチューニング：Query Acceleration Service

# はじめに
Snowflakeにおけるパフォーマンスチューニングには複数の方法があります。
その１つのQuery Acceleration Serviceについて、勉強した内容をまとめておこうと思います。

# Query Acceleration Serviceとは
クエリの処理時に<font color="Red">ウェアハウスのコンピュートリソースが足りない場合、一時的にリソースを増強</font>させる機能です。

例えば、Sサイズのウェアハウスを使って、1～10GBのテーブルにクエリする場合、数秒～1分くらいでクエリ結果が返ってきますが、100GB以上の場合だと数分かかります。

Query Acceleration Serviceを利用すると、Sサイズのウェアハウスではリソースが足りないと判断し、リソースを一時的に増強して、パフォーマンスを改善させることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1925708/8f2bd172-a2bd-6bfd-62b4-562697e96641.png)

Query Acceleration Serviceは、リソースが不足している場合にのみリソースを増強します。
リソースの不足は、Snowflakeが自動で判断します。
そのため、ユースケースとしては、<font color="Red">クエリごとのデータ量が予測できない</font>運用が適しています。

# Query Acceleration Serviceを利用する際の注意点
### ①エディション
Query Acceleration Serviceを利用するには、Enterprise Edition以上が必要です。

### ②Query Acceleration Serviceを利用できるSQL
以下に該当するSQL文で、Query Acceleration Serviceのによるパフォーマンスの改善が期待できます。
・<font color="Red">SELECT文</font>（<font color="Red">WHERE句</font>での条件指定、もしくは<font color="Red">GROUP BY句</font>での集約が行われていること）
・<font color="Red">INSERT文</font>（挿入するデータを<font color="Red">SELECT句</font> で指定していること。Insert Into テーブル名 Select・・・)
・<font color="Red">CREATE TABLE AS SELECT(CTAS)</font>

### ③Query Acceleration Serviceを利用できないSQL
以下に該当するSQL文では、Query Acceleration Serviceを利用できません。
　・WHERE句での条件指定がない、または条件指定していてもテーブルの大部分を取得するSELECT文
　・GROUP BY句での集約がない、またはカーディナリティが高い列にGROUP BYを使っているSELECT文
　・テーブルのマイクロパーティションの数が少ない(テーブルの容量自体が小さいことを意味する）
　・LIMIT句を使っているSELECT文（ただし、Order By句を一緒に使っている場合は、利用できないSQLと見なされません）

※カーディナリティが高い列
　列に格納されているデータの種類がどのくらいあるのかを示します。
　種類が多いほど、カーディナリティが高いと言えます。
　例えば、タイムスタンプ型の列はカーディナリティが高くなります。

### ④クレジットを消費する
Query Acceleration Serviceにより一時的に増強されたリソースがクレジット消費の対象となります。
リソースを消費した分だけ課金されます。（１秒単位の課金）
消費されたクレジットは、[QUERY_ACCELERATION_HISTORY](https://docs.snowflake.com/ja/sql-reference/account-usage/query_acceleration_history)で確認できます。

# Query Acceleration Serviceの利用方法
　Query Acceleration Serviceは、<font color="Red">ウェアハウス単位で有効化</font>します。
　そのため、まず、Query Acceleration Serviceでパフォーマンスを改善できるウェアハウスを特定します。
　
　以下の手順で、Query Acceleration Serviceを利用します。
 　手順1：Query Acceleration Serviceでパフォーマンスを改善できるウェアハウスを特定する
 　手順2：必要なscale factorを確認する
 　手順3：ウェアハウスの設定変更でQuery Acceleration Serviceを有効にする
  
## 手順1：Query Acceleration Serviceでパフォーマンスを改善できるウェアハウスを特定する
ACCOUNT_USAGEスキーマの<font color="Red">QUERY_ACCELERATION_ELIGIBLE</font>ビューを参照して、パフォーマンスを改善できるウェアハウスを特定します。

以下のSQLは、Query Acceleration Serviceでパフォーマンスを改善できるSQLが実行されているウェアハウスと、対象のSQLの実行時間を抽出しています。
```
SELECT 
  warehouse_name, 
  SUM(eligible_query_acceleration_time) AS total_eligible_time
FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_ACCELERATION_ELIGIBLE
WHERE start_time >= DATEADD('days', -1, current_date())
GROUP BY warehouse_name
ORDER BY total_eligible_time DESC;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1925708/8e69d129-c479-a2ac-c7b5-b32e26ca0b87.png)


## 手順2：必要なscale factorを確認する
scale factorとは、Query Acceleration Serviceの利用時の<font color="Red">クレジット消費量を制限</font>する機能です。
Query Acceleration Serviceから増強してもらうリソースの量に<font color="Red">上限値</font>を設定することで、クレジット消費を制限します。

scale factorで指定する値は、<font color="Red">各サイズのウェアハウスが消費するクレジットの倍数</font>です。

例えば、Sサイズのウェアハウスで、scale factor = 5と設定した場合、１時間当たりのクレジットの最大消費は以下になります。

**2クレジット/時間(Sサイズの場合) X 5 = 10クレジット/時間**

scale factorについても、<font color="Red">QUERY_ACCELERATION_ELIGIBLE</font>ビューを参照して、適切な設定値を確認します。

以下は、手順1で特定したウェアハウスのscale factorを確認する例です。
```
SELECT upper_limit_scale_factor, COUNT(upper_limit_scale_factor)
  FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_ACCELERATION_ELIGIBLE
  WHERE warehouse_name = '<手順1で特定したウェアハウスの名称>'
  GROUP BY 1 ORDER BY 1;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1925708/adf61653-084f-17e4-1f27-1846554f92ec.png)

**※scale factor = 0とした場合**
　Query Acceleration Serviceが、クレジット消費の制限なくリソースを増強することを意味します。

## 手順3：ウェアハウスの設定変更でQuery Acceleration Serviceを有効にする
QUERY_ACCELERATION_MAX_SCALE_FACTORに手順2で確認したscale factorの値を指定して、Query Acceleration Serviceを有効化します。
```
ALTER WAREHOUSE <ウェアハウスの名称> SET
  ENABLE_QUERY_ACCELERATION = true
  QUERY_ACCELERATION_MAX_SCALE_FACTOR = <手順2で確認したscale factor>;
```

# その他のパフォーマンスチューニングについて
その他のチューニング方法としては、<font color="Red">クラスタリング</font>という方法もございます。
* [Snowflakeにおけるパフォーマンスチューニング：クラスタリング](https://qiita.com/KimiyukiMuramatsu/items/87f0573d177c2bc1f2fd)
# 参考にしたサイト
* [Snowflakeドキュメント](https://docs.snowflake.com/ja/user-guide/query-acceleration-service)

# ご案内
株式会社ジールでは、「ITリテラシーがない」「初期費用がかけられない」「親切・丁寧な支援がほしい」「ノーコード・ローコードがよい」「運用・保守の手間をかけられない」などのお客様の声を受けて、オールインワン型データ活用プラットフォーム「ZEUSCloud」を月額利用料にてご提供しております。
ご興味がある方は是非下記のリンクをご覧ください：
https://www.zdh.co.jp/products-services/cloud-data/zeuscloud/?utm_source=qiita&utm_medium=referral&utm_campaign=qiita_zeuscloud_content-area