Snowflakeはスケールアップ?スケールアウト?並列度とクエリ特性で決める最適解
Snowflakeのスケールアップとスケールアウトは、並列度やクエリ特性で使い分けるのが鍵。最適なスケーリング戦略でコストとパフォーマンスを最大化し、データドリブン経営を加速させましょう。
目次 クリックで開く
データ基盤の運用において、最も頭を悩ませるのが「パフォーマンスとコストのトレードオフ」です。Snowflakeはストレージとコンピュート(計算リソース)を完全に分離したアーキテクチャを採用しており、仮想ウェアハウスの柔軟なスケーリングが可能です。しかし、実務では「いつサイズを上げるべきか(スケールアップ)」「いつクラスタ数を増やすべきか(スケールアウト)」の判断基準が曖昧になりがちです。
本記事では、Snowflakeの仕様に基づき、クエリ特性や並列度に応じた最適なスケーリング戦略を、具体的な設定手順や公式事例を交えて解説します。
Snowflakeにおける「スケーリング」の基本概念
Snowflakeの計算リソースである「仮想ウェアハウス」には、2種類の拡張方法があります。これらを正しく使い分けることで、バッチ処理の遅延解消や、ユーザー増加によるダッシュボードの応答悪化を防ぐことができます。
スケールアップ(垂直スケーリング)とスケールアウト(水平スケーリング)の違い
Snowflakeのスケーリングは、以下の2軸で考えます。
- スケールアップ(垂直):1つの仮想ウェアハウスのサイズ(XS, S, M, L…)を大きくすること。個々のクエリに割り当てられるCPU・メモリ・ローカルストレージが増加し、大規模な結合や集計処理を高速化します。
- スケールアウト(水平):マルチクラスタウェアハウス機能を使用し、同じサイズのウェアハウスを複数並列で稼働させること。同時実行される多数のクエリを分散処理し、待ち時間(キューイング)を解消します。
仮想ウェアハウスのサイズ(T-Shirt Size)とリソースの関係
仮想ウェアハウスのサイズは、最小の「X-Small」から最大の「6X-Large」まで用意されています。サイズが1段階上がると、コンピューティングリソースと時間あたりのクレジット消費量は2倍になります。
| サイズ | クレジット/時 | 主な用途 |
|---|---|---|
| X-Small | 1 | 少量のデータロード、単純なSQL実行 |
| Small | 2 | 小規模なBIレポート、開発環境 |
| Medium | 4 | 標準的なバッチ処理、中規模集計 |
| Large | 8 | 大規模なデータ変換、複雑なJoin |
| X-Large以上 | 16〜 | 数億〜数兆件規模のテラバイト級データ処理 |
【公式ドキュメント】仮想ウェアハウスの概要 – Snowflake
スケールアップを選択すべきケース:複雑な単一クエリの高速化
スケールアップの主な目的は、「重いクエリ1件あたりの実行時間を短縮すること」です。特に、大規模テーブル同士の結合(Join)や、ウィンドウ関数の多用によりメモリ不足が発生している場合に有効です。
クエリプロファイルを用いた「スペリング(Spilling)」の検知と対策
ウェアハウスのサイズが不足しているかどうかを判断する最も確実な指標は、クエリプロファイルにおける「Remote Disk Spilling(リモートディスクへの書き出し)」の有無です。
メモリ内で処理が完結せず、ローカルストレージやリモートストレージ(S3等)へ一時データが溢れ出している状態(Spilling)が発生している場合、処理速度は劇的に低下します。この数値が顕著な場合は、サイズを1段階上げることで、処理時間が半分以下になる可能性があります。
データ基盤を構築する際、Snowflake単体ではなく、周辺ツールとの連携も重要です。例えば、マーケティングデータの高度な活用を検討している場合は、BigQueryとリバースETLで構築する「行動トリガー型LINE配信」のようなアーキテクチャ思想も参考になります。
スケールアウトを選択すべきケース:同時実行ユーザー・クエリの増加
スケールアウト(マルチクラスタウェアハウス)の目的は、「クエリの並列処理能力を高め、待ち時間をゼロにすること」です。朝のダッシュボード閲覧ラッシュ時や、多くのユーザーが同時にアドホック分析を行う環境で威力を発揮します。
マルチクラスタウェアハウス(MCW)の自動拡張ロジック
SnowflakeのEnterpriseエディション以上で利用可能なMCWは、以下のパラメータで制御されます。
- MAX_CLUSTER_COUNT:最大何クラスタまで並列稼働させるか(最大10)。
- MIN_CLUSTER_COUNT:常に稼働させておく最小クラスタ数。
- Scaling Policy:拡張のタイミング(StandardまたはEconomy)。
スケーリングポリシーの使い分け
| ポリシー | 動作特性 | 推奨用途 |
|---|---|---|
| Standard(標準) | クエリがキューに入った瞬間、またはシステムが負荷を検知した直後に新しいクラスタを起動。 | BIツール、ダッシュボード、即時性が求められる分析。 |
| Economy(経済的) | システムが「既存リソースだけで6分間負荷を維持できる」と判断した場合のみ新クラスタを起動。 | バッチ処理、時間に余裕のある定期レポート。 |
Snowflakeと主要DWHのスペック・料金比較
Snowflakeは「秒単位の従量課金」と「コンピュートの即時停止」が強みですが、Google BigQueryやAmazon Redshift Serverlessと比較してどちらが適しているかは、ワークロードに依存します。
| 項目 | Snowflake | Google BigQuery | Amazon Redshift Serverless |
|---|---|---|---|
| スケーリング方式 | サイズ変更(秒単位) / クラスタ自動増設 | スロット(計算リソース)の自動割り当て | RPU(Redshift Processing Units)の自動調整 |
| 課金体系 | ウェアハウス稼働時間(秒単位) | スキャン量 または 予約スロット時間 | RPU時間単位 |
| 公式導入事例 | SREホールディングス | メルカリ | NTTドコモ |
特に社内業務のDXを推進する場合、データの出口戦略(SFA連携や会計連携)が重要です。例えば、freee会計の「経営可視化・高度連携」フェーズで解説しているような、BIツールへのシームレスなデータ供給において、Snowflakeのスケールアウト性能は大きな武器になります。
実務で使える仮想ウェアハウス最適化の手順
実際にSnowflakeを運用する際の設定ステップを解説します。
ステップ1:クエリ特性の分類とウェアハウスの分離
一つのウェアハウスですべて(ロード、変換、BI)を賄うのは悪手です。リソース競合を避けるため、用途別にウェアハウスを分けます。
LOAD_WH(X-Small):データ取り込み用。自動サスペンドは最短(1分以下)に設定。TRANSFORM_WH(Medium〜Large):dbt等を用いた変換用。バッチ終了時に停止するようスケジュール。REPORT_WH(Small, MCW設定):BIツール連携用。マルチクラスタを有効にし、Standardポリシーで運用。
ステップ2:自動サスペンドと自動レジュームの最適設定
Snowflakeのコストを抑える鍵は「使っていない時に止める」ことです。
ALTER WAREHOUSE my_wh SET AUTO_SUSPEND = 60 -- 60秒間クエリがなければ自動停止 AUTO_RESUME = TRUE; -- クエリが来たら自動で再開
※最近のSnowflakeは秒単位課金(最低60秒)のため、バッチ処理用ならAUTO_SUSPEND = 60、アドホック分析用ならAUTO_SUSPEND = 300(キャッシュ再利用のため)程度が目安です。
ステップ3:リソースモニターによるコストガードレールの設置
予期せぬクエリループや設定ミスによる高額請求を防ぐため、アカウントレベルまたはウェアハウスレベルで制限を設定します。
- クォータ設定:月間100クレジットを超えたら通知。
- サスペンド設定:月間120クレジットを超えたら、現在のクエリ完了後にウェアハウスを停止。
こうした厳密なコスト管理とデータ連携の考え方は、会計システムの移行などでも共通する重要事項です。例えば、勘定奉行からfreee会計への移行ガイドで求められる「データの整合性とコスト効率」の視点は、DWH構築にもそのまま適用できます。
よくあるトラブルと解決策(トラブルシューティング)
クエリがキューに溜まる(Queued Query)
原因: 既存のウェアハウスの並列実行上限(通常、1クラスタあたり8クエリ程度)に達している。
解決策: マルチクラスタウェアハウスの MAX_CLUSTER_COUNT を増やしてください。サイズ(SをMにする等)を上げても、並列実行数は増えません。
ウェアハウスのサイズを上げても速度が変わらない
原因: クエリ自体が並列処理に適していない(単一の小さいファイルを処理している、またはシリアルな処理が含まれる)。
解決策: データのクラスタリングキーを見直すか、ファイルを分割してロード(Parallel Ingest)しているか確認してください。
まとめ:並列度とデータ量で決める最適解
Snowflakeの性能を最大限に引き出すための原則はシンプルです。
- 「処理が重い(Spillingがある)」ならスケールアップ。
- 「待ち時間がある(Queued)」ならスケールアウト。
この2点をクエリプロファイルから正確に読み取り、適切なT-Shirtサイズとクラスタ数を設定することで、無駄なクレジット消費を抑えつつ、ユーザーにストレスのないデータ分析環境を提供することが可能になります。
運用前に知っておきたい「ウェアハウス選定」の盲点と誤解
Snowflakeの柔軟なスケーリングは強力ですが、仕様を誤解すると「コストだけが倍増して速度が変わらない」という事態を招きます。特に以下の3点は、設計段階で頻繁に議論されるポイントです。
1. サイズを上げても「並列実行数」は増えない
仮想ウェアハウスのサイズ(XSからSなど)を上げると、1つのクエリに割り当てられるコンピューティングパワーは強化されますが、同時に処理できるクエリ数(スループット)が劇的に増えるわけではありません。多くのユーザーによる同時アクセスを捌くには、サイズアップではなくマルチクラスタ(スケールアウト)が正解です。
2. キャッシュ効率と自動サスペンドの相関
コスト削減のためにAUTO_SUSPENDを極端に短く設定(例:1分未満)すると、ウェアハウスが頻繁にコールドスタート状態になり、ローカルディスクキャッシュが破棄されます。これにより、同じクエリを再実行してもキャッシュが効かず、結果的に処理時間が伸びてクレジットを消費することがあります。アドホックな分析用途では、5分(300秒)程度の保持が推奨されるケースも多いです。
3. データロードとクエリ実行の分離
データ取り込み(COPY INTO等)とエンドユーザーのBIクエリを同じウェアハウスで実行すると、リソースの奪い合いが発生し、BIのレスポンスが低下します。Snowflakeの強みは「ストレージが共通で、コンピュートを分離できる」点にあります。用途ごとにウェアハウスを完全に分けることが、運用安定化の最短ルートです。
【チェックリスト】スケールアップか、スケールアウトか?
現在のボトルネックがどちらにあるか、以下のフローで確認してください。
| 状況 | 確認指標(Query Profile) | 推奨アクション |
|---|---|---|
| 1つのクエリが終わらない | Bytes spilled to local/remote storage が大きい | スケールアップ(サイズを上げる) |
| クエリ実行までに時間がかかる | Query Load Chart で Queued(待ち)が発生している | スケールアウト(クラスタ数を増やす) |
| 特定テーブルの検索が遅い | Partitions scanned が全パーティションに近い | クラスタリングキーの設定(物理構造の見直し) |
さらなるデータ基盤の高度化に向けて
Snowflakeで最適化されたデータ基盤は、単なるレポート作成に留まらず、マーケティングやバックオフィス業務の自動化において真価を発揮します。例えば、蓄積された顧客データを活用して「高額なツールに依存しない施策」を展開する場合、モダンデータスタックを用いたツール選定と公式事例が参考になります。
また、ビジネスの成長に伴い増大するSaaSコストやアカウント管理の負債を整理するには、インフラ側での自動化アプローチも不可欠です。SaaSコストとオンプレ負債を断つ現実的な剥がし方を併せて確認し、コスト効率の高いアーキテクチャ設計を目指してください。
【公式ドキュメント:コスト管理】
Snowflakeコストの概要
ご相談・お問い合わせ
本記事の内容を自社の状況に当てはめたい場合や、導入・運用の設計を一緒に整理したい場合は、当社までお気軽にご相談ください。担当より折り返しご連絡いたします。
CRM・営業支援
Salesforce・HubSpot・kintoneの選定から導入・カスタマイズ・定着まで一貫対応。営業生産性を高め、商談化率を改善します。