▼背景
Snowflakeの料金の一つにコンピューティング料金がある。これはSQLなどのクエリを実行するために必要なリソースに掛かる料金だ。
この料金体系についてある程度分かったつもりでいたが、想定以上に必要がかさんでいる現状があり料金について調べてみた。
すると、分かっていたつもりだったが全然分かってなかったことに気が付いた。
この記事を書いている今も完全には理解できていませんが、知っておかないと無駄な費用がかかる点に気づいた。
なるべくSnowflakeの公式ドキュメントなどを参考に理解を試みた。
▼私のこれまでのコンピューティング料金の認識と誤解していた点
これまでの認識(※間違っている)
私はコンピューティング料金については以下のように捉えていた。
- Snowflakeがクエリを実行するために必要なリソースの使用時間に対して費用が設定される。
- Snowflakeではリソースはwarehouseという単位で管理されており、warehouseの使用時間に対して料金が掛かる
- warehouseにはサイズがありそのサイズが大きくすると処理の並列処理量とコストが大きくなっていく。
- XSは1倍
- Sは2倍
- Mは4倍
- Lは8倍
⇒warehouseを大きくすれば、クエリ処理時間が速くなる分料金が上がる。料金は、以下計算式で算出できる(と思っていた)
「クエリ実行時間 × 選択したwarehouseサイズごとの倍率 × snowflakeが定めた時間あたりの費用」
認識出来ていなかった点・誤解していた点
上記私の認識は概ね間違っていない。しかし、いくつか間違いがある。
①コストはクエリ実行時間に掛かるのではなく、コンピューティングリソースを使用する時間つまり、「各warehouseの稼働時間」に掛かる
「クエリ実行時間 = warehouseの稼働時間」と言えそうにも見れるが注意したい。なぜなら、必ずしもwarehouseはクエリを実行している時間だけ稼働しているわけではないからだ。
考えてみると、確かにそんな都合良くクエリを実行している間のみマシンが稼働させられるとは考えにくい。
②warehouseごとにwarehouseの稼働・自動停止設定が行える
以下のような設定がwarehouseごとに行える。
warehouseをいつ再開させ、いつ停止するか指定できる。
この設定からも分かるように、warehouseの稼働はこの設定によって制御され、クエリを実行している時間だけではない。
つまり、warehouseが起動・再開してから自動一時停止時間まで稼働すると分かる。
もし自動停止時間を5分に設定していたとする。
10秒で終わるクエリをXSにて実行してその後5分放置したとすると、掛かる費用はXSの10秒分ではなくXSの300秒分なのである。
クエリ実行時間 = 料金という考えは大きな間違いだったのだ
③課金される最低秒数が設定されている
1秒ならx円, 30秒なら30x円のように単純に捉えていたが、最低秒数が設定されている。
以下のように設定されている。
warehouseが 開始される か 再開される たびに、上記の時間料金に基づいて1分間の使用量に対する請求がなされます
▼間違いを訂正し、Snowflakeのコンピューティング料金についてまとめる
ここまで間違っていた認識と新たに知った点について記載した。ここからは正しく認識しなおした点とその他料金についての内容をまとめて整理することとする。
- 料金が掛かる単位は?
- その単位は何と対応するのか
- 料金を算出する計算式は?
●Snowflakeの支払い測定単位「クレジット」
Snowflakeクレジット は、各仮想ウェアハウスで使用される処理時間の支払いに使用されます。Snowflakeクレジットは、使用する仮想ウェアハウスの数、実行時間、およびサイズに基づいて請求されます。
参考
⇒クレジットという単位で料金が請求される
⇒1クレジット = $2(約300円)
※STANDARDプラン US EASTリージョンの場合
また、1クレジットはXSのwarehouseが1時間稼働した際に消費されるクレジットである。
●クレジットは何に対して掛かるものか
ウェアハウスは、実行している間のクレジット使用状況のみが請求されます。ウェアハウスを一時停止すると、クレジットは使用されません。
参考
⇒上記設定内容と記述から、warehouseの実行は起動から停止までの時間中行われることが分かり、クエリ実行時間ではなくwarehouse実行時間・稼働時間に対してクレジットが使用されることが分かる。
⇒warehouseの起動後クエリを実行しなくても稼働時間分クレジットが消費され、料金が掛かる。
●warehouse, 時間ごとの消費クレジット
⇒ 1クレジット = XS 1時間 = S 30分 = M 15分
●コンピューティング料金を算出する計算式
warehouse稼働時間(秒数) × 1/3600 × 選択したwarehouse倍率 × 2$(プランによる)
ex) XSのwarehouseを3分稼働した場合
⇒ 3 * 60秒 × 1/3600 × 1 × 2$
⇒ 0.1$(約15円)
※クエリ実行時間ではなく、warehouse稼働時間
●注意事項
クレジットは最低60秒ごとに請求される。
ウェアハウスが 開始される か 再開される たびに、上記の時間料金に基づいて1分間の使用量に対する請求がなされます。
参考
⇒ warehouse起動するとすぐ停止したとしても、60秒分はクレジットが消費される。
▼これまでの内容を理解するため、具体例を考えてみる
使用するwarehouseとそのwarehouseの自動停止設定によって料金を考える。
①XS warehouse, 自動再開設定あり, 自動停止設定5分
シナリオ
①10:00 クエリ実行 実行時間30秒
②10:02 クエリ実行 実行時間20秒
費用計算
この場合、最終的に掛かる料金は②が実行終えるまでの合計時間 + ②が終わってから5分に対して費用が掛かる。
①のクエリ実行でウェアハウスが10:00に起動し、②のクエリ終了が10:02:20。その後、自動停止設定5分により10:07:20に停止。稼働時間は合計7分20秒
⇒ 440秒 × 1/3600 × 1 × 2$
⇒ 0.24$(約36円)
②S warehouse, 自動再開設定あり, 自動停止設定2分
シナリオ
①10:00:00 クエリ実行 実行時間30秒
②10:03:00 クエリ実行 実行時間90秒
③10:05:00 クエリ実行 実行時間300秒
費用計算
①でwarehouse起動したが、10:02:30に自動停止
②再度warehouse起動
③②で起動したものを使ってクエリ実行
- 1回目の起動:10:00:00 ~ 10:02:30まで起動(90秒)
- 2回目の起動:10:03:00 ~ 10:12:00まで起動(540秒)
⇒630秒 × 1/3600 × 2 × 2$
⇒0.7$(105円)
③XS warehouse, 自動再開設定なし, 自動停止設定5分, 自分で停止
シナリオ
warehouse再開
①10:00:00 クエリ実行 実行時間30秒
②10:00:30 クエリ実行 実行時間90秒
③10:02:00 クエリ実行 実行時間300秒
終了後warehouse停止
費用計算
この場合、稼働時間は10:00:00 ~ 10:07:00 合計7分
⇒420 * 1/3600 * 1 * 2$
⇒0.23$(約35円)
★ベストな設定と意識することを考えてみる
ここまでSnowflakeの料金体系について考えてきた。設定によって掛かる料金も変わることが分かった。置かれている状況によってベストな設定や運用は変わってくるだろう。私の状況を一例にベストな設定と意識すべきことを考えてみる。
考えるべきなのは以下だろう
- 選択するwarehouse
- 自動再開オプション
- 自動一時停止オプション
- 指定一時停止時間
- 意識すべきこと
状況と背景
私が業務で使っているSnowflakeの検証用のアカウントとして私用環境をセットアップし使用している。
そのため、使用するのは業務にて検証したいことが発生した際にたまに使用する程度である。また、ストレージに保管しているデータ量としては少なく、数KBである。そのため、実行するクエリはほぼ1秒も掛からず終了する。
コストを抑えるベストな運用を考える
検討項目別
| 検討項目 | 内容 | 理由 |
|---|---|---|
| 選択warehouse | XS | 一番安い。使用するデータ量少ないから十分 |
| 自動再開オプション | なし | warehouseが知らないうちに稼働していることを避ける。どの操作にwarehouseが使われているかを知るきっかけともなる |
| 自動一時停止 | あり | 止め忘れを防ぐ |
| 自動一時停止時間 | 5分 | 1つの検証作業内でトライアンドエラーを繰り返す際は5分以内には実行を繰り返すことが多い気がするため。そこまで厳密な理由はない |
運用方針・意識すること
基本的に手動でwarehouseを立ち上げて、作業が終わったら手動でwarehouseを停止する。
止め忘れによる費用の増大を防ぐため念のため自動一時停止時間を5分に設定しておくことにする。
また、作業する際はwarehouseの稼働時間を極力減らすため予め実行したいクエリを用意しておいて一気に実行する。
⇒必要以上のコストが掛かることが無く、コストを下げて作業を行える
warehouse手動立ち上げはUI上で再開ボタンを押下または、クエリとして実行する。
alter warehouse COMPUTE_WH resume;
★まとめ
- Snowflakeのコンピューティング料金は warehouseの稼働時間に対して課金される
- クエリ実行時間だけではない
- 最低課金時間(1分)がある
- サイズを大きくすると並列処理は増えるが料金も増える
- 運用設定(自動再開/自動停止)でコストを大きく左右する
さらなる理解に向けて
Snowflakeが公開しているCreditConsumptionTableというpdfを見つけた。ここにはwarehouseや料金について詳細に記述されていそう。このpdfを読み解きさらなる理解を行いたい

