はじめに
Snowflakeにおけるパフォーマンスチューニングには複数の方法があります。
その1つのQuery Acceleration Serviceについて、勉強した内容をまとめておこうと思います。
Query Acceleration Serviceとは
クエリの処理時にウェアハウスのコンピュートリソースが足りない場合、一時的にリソースを増強させる機能です。
例えば、Sサイズのウェアハウスを使って、1~10GBのテーブルにクエリする場合、数秒~1分くらいでクエリ結果が返ってきますが、100GB以上の場合だと数分かかります。
Query Acceleration Serviceを利用すると、Sサイズのウェアハウスではリソースが足りないと判断し、リソースを一時的に増強して、パフォーマンスを改善させることができます。
Query Acceleration Serviceは、リソースが不足している場合にのみリソースを増強します。
リソースの不足は、Snowflakeが自動で判断します。
そのため、ユースケースとしては、クエリごとのデータ量が予測できない運用が適しています。
Query Acceleration Serviceを利用する際の注意点
①エディション
Query Acceleration Serviceを利用するには、Enterprise Edition以上が必要です。
②Query Acceleration Serviceを利用できるSQL
以下に該当するSQL文で、Query Acceleration Serviceのによるパフォーマンスの改善が期待できます。
・SELECT文(WHERE句での条件指定、もしくはGROUP BY句での集約が行われていること)
・INSERT文(挿入するデータをSELECT句 で指定していること。Insert Into テーブル名 Select・・・)
・CREATE TABLE AS SELECT(CTAS)
③Query Acceleration Serviceを利用できないSQL
以下に該当するSQL文では、Query Acceleration Serviceを利用できません。
・WHERE句での条件指定がない、または条件指定していてもテーブルの大部分を取得するSELECT文
・GROUP BY句での集約がない、またはカーディナリティが高い列にGROUP BYを使っているSELECT文
・テーブルのマイクロパーティションの数が少ない(テーブルの容量自体が小さいことを意味する)
・LIMIT句を使っているSELECT文(ただし、Order By句を一緒に使っている場合は、利用できないSQLと見なされません)
※カーディナリティが高い列
列に格納されているデータの種類がどのくらいあるのかを示します。
種類が多いほど、カーディナリティが高いと言えます。
例えば、タイムスタンプ型の列はカーディナリティが高くなります。
④クレジットを消費する
Query Acceleration Serviceにより一時的に増強されたリソースがクレジット消費の対象となります。
リソースを消費した分だけ課金されます。(1秒単位の課金)
消費されたクレジットは、QUERY_ACCELERATION_HISTORYで確認できます。
Query Acceleration Serviceの利用方法
Query Acceleration Serviceは、ウェアハウス単位で有効化します。
そのため、まず、Query Acceleration Serviceでパフォーマンスを改善できるウェアハウスを特定します。
以下の手順で、Query Acceleration Serviceを利用します。
手順1:Query Acceleration Serviceでパフォーマンスを改善できるウェアハウスを特定する
手順2:必要なscale factorを確認する
手順3:ウェアハウスの設定変更でQuery Acceleration Serviceを有効にする
手順1:Query Acceleration Serviceでパフォーマンスを改善できるウェアハウスを特定する
ACCOUNT_USAGEスキーマのQUERY_ACCELERATION_ELIGIBLEビューを参照して、パフォーマンスを改善できるウェアハウスを特定します。
以下の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;
手順2:必要なscale factorを確認する
scale factorとは、Query Acceleration Serviceの利用時のクレジット消費量を制限する機能です。
Query Acceleration Serviceから増強してもらうリソースの量に上限値を設定することで、クレジット消費を制限します。
scale factorで指定する値は、各サイズのウェアハウスが消費するクレジットの倍数です。
例えば、Sサイズのウェアハウスで、scale factor = 5と設定した場合、1時間当たりのクレジットの最大消費は以下になります。
2クレジット/時間(Sサイズの場合) X 5 = 10クレジット/時間
scale factorについても、QUERY_ACCELERATION_ELIGIBLEビューを参照して、適切な設定値を確認します。
以下は、手順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;
※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>;
その他のパフォーマンスチューニングについて
その他のチューニング方法としては、クラスタリングという方法もございます。
参考にしたサイト
ご案内
株式会社ジールでは、「ITリテラシーがない」「初期費用がかけられない」「親切・丁寧な支援がほしい」「ノーコード・ローコードがよい」「運用・保守の手間をかけられない」などのお客様の声を受けて、オールインワン型データ活用プラットフォーム「ZEUSCloud」を月額利用料にてご提供しております。
ご興味がある方は是非下記のリンクをご覧ください:
https://www.zdh.co.jp/products-services/cloud-data/zeuscloud/?utm_source=qiita&utm_medium=referral&utm_campaign=qiita_zeuscloud_content-area