第4章 パフォーマンス最適化・クエリ・変換 / 想定学習時間:30〜40分 / 最終確認:2026年8月

4-3. ウェアハウス設計とワークロード管理

🎯 この節の学習目標

1. ワークロード分離:ウェアハウスを分けても損しない

Snowflake のアーキテクチャ(1章)の要点は、ストレージとコンピュートの分離でした。どのウェアハウスからも同じデータにアクセスできるため、用途ごとにウェアハウスを分けても、データのコピーは一切不要です。そして課金は各ウェアハウスの稼働時間ベースなので、「ウェアハウスを増やすと待機コストが倍増する」ということもありません(使っていなければサスペンドされるだけです)。

そこで実務では、性質の異なるワークロードごとにウェアハウスを分離するのが定石です。

ワークロード特徴ウェアハウス設計の例
データロード(ETL/ELT)夜間バッチなど定期的・計画的。ファイル並列数に応じたサイズで十分ロード専用WH。処理量に見合うサイズ、終了後すぐサスペンド
BI・ダッシュボード多数のユーザーによる小〜中規模クエリが同時多発BI専用WH。マルチクラスタで同時実行に追従
アドホック分析・データサイエンス少人数だが重いクエリが不定期に発生分析専用WH。必要に応じて大きめサイズ、auto-suspend 活用

分離の最大の利点は相互干渉の排除です。夜間ロードが長引いても BI ユーザーのクエリはキューに詰まりませんし、アドホックな重いクエリがダッシュボードを遅くすることもありません。またウェアハウス単位でコストが集計されるため、部門やワークロードごとのコスト把握も容易になります。

ワークロードの種別を判定ロード/BI/アドホックなど、性質(定期性・同時実行数・クエリの重さ)で分類
ロード用WHバッチ規模に応じたサイズ・即サスペンド
BI用WHマルチクラスタで同時実行に対応
アドホック用WH重いクエリ向けに大きめサイズ
どのWHも同じストレージ上のデータを共有(コピー不要)
相互干渉のないワークロード実行WH単位でサイズ・クラスタ数・コストを独立に管理

図:ワークロード種別ごとの専用ウェアハウスへの分離

2. サイズ選定:スケールアップ vs スケールアウト(復習と深掘り)

1-5 で学んだ2つの拡張方法を、ワークロード管理の観点から整理し直します。

スケールアップ(サイズ変更)スケールアウト(マルチクラスタ)
何を変えるかウェアハウスのサイズ(XS→S→M…、1段階でノード数・メモリ倍増)同一サイズのクラスタの(MIN/MAX_CLUSTER_COUNT)
解決する問題個々のクエリが重い:複雑な結合・大量データのスキャン・スピルの発生同時実行が多い:キュー待ち(Queued)時間の増大
効かない問題同時実行の詰まり(1つのクエリは速くなるが、キューは残る)個々の重いクエリ(クラスタが増えても1クエリは1クラスタで実行)
典型ワークロードETL・アドホックの重い分析BI・ダッシュボード

サイズ選定に万能の公式はありませんが、実務では「小さめで始めて、Query Profile の所見(スピル・実行時間)を見ながら上げる」のが基本です。サイズを1段階上げるとクレジット消費率は倍になりますが、実行時間が半分近くまで短縮されるなら総コストはほぼ変わらず、待ち時間だけが改善します。逆に、小さいクエリしか流れないウェアハウスを大きくしても、ノードが遊ぶだけでコストの無駄になります。

📝 試験のポイント

「複雑で重いクエリ・大量データ処理・スピル → スケールアップ」「同時実行ユーザー数の増加・キュー待ち → スケールアウト(マルチクラスタ)」という対応付けは、シナリオ問題として繰り返し問われます。症状がどちらなのかを見極めるのが解答の鍵です。

3. Query Acceleration Service(QAS)

Query Acceleration Service(QAS)は、Enterprise エディション以上で利用できる機能で、ウェアハウスで実行中のクエリのうち大規模なスキャン・フィルタ部分をサーバーレスの計算資源へオフロードして並列処理します。ウェアハウス単位で有効化します。

-- QAS を有効化し、スケールファクターを設定する
ALTER WAREHOUSE analytics_wh SET
  ENABLE_QUERY_ACCELERATION = TRUE
  QUERY_ACCELERATION_MAX_SCALE_FACTOR = 8;

4. Snowpark-optimized warehouse

通常のウェアハウスとは別に、Snowpark-optimized warehouse という種類があります。同サイズの標準ウェアハウスに比べてノードあたりのメモリが大幅に多く構成されており、Snowpark(Python など)によるメモリ集約的な処理——大規模なデータフレーム操作や機械学習モデルの学習など——に向いています。

CREATE WAREHOUSE ml_wh
  WAREHOUSE_SIZE = 'MEDIUM'
  WAREHOUSE_TYPE = 'SNOWPARK-OPTIMIZED';

SQL 中心の一般的なワークロードには標準ウェアハウスで十分です。「メモリ集約処理(ML学習など)には Snowpark-optimized」という対応だけ覚えておけば試験対策としては足ります。

なお、標準ウェアハウスには改良版の世代である Gen2(第2世代)標準ウェアハウスも提供されています。より新しいハードウェアとソフトウェア最適化により、同じサイズ表記でも従来の標準ウェアハウスより分析クエリや DELETE / UPDATE / MERGE などのテーブル書き換えが高速になるよう設計されています。サイズやマルチクラスタといった使い方の考え方は従来と同じで、「標準ウェアハウスに性能を改良した新世代がある」と押さえておけば十分です。

5. タイムアウトと同時実行の制御パラメータ

ウェアハウスの秩序を保つために、次のパラメータを設定できます(アカウント・セッション・ウェアハウスなどのレベルで指定可能です)。

パラメータ意味使いどころ
STATEMENT_TIMEOUT_IN_SECONDSステートメントの実行時間の上限。超えるとクエリは自動的にキャンセルされる書き間違いによる暴走クエリが何時間もクレジットを消費するのを防ぐ
STATEMENT_QUEUED_TIMEOUT_IN_SECONDSキュー待ち時間の上限。超えたクエリはキューから取り除かれる「古くなったら実行する意味がない」クエリ(ダッシュボードの自動更新など)が、混雑解消後にまとめて流れるのを防ぐ
MAX_CONCURRENCY_LEVEL1クラスタで同時実行するステートメント数の目安下げると1クエリあたりの資源が増え、上げると同時実行性が増す(通常は既定値のままでよい)

💡 具体例:アドホック分析用ウェアハウスの保護設定

-- 2時間を超えるクエリは自動キャンセル、5分以上キューに滞留したら取り除く
ALTER WAREHOUSE adhoc_wh SET
  STATEMENT_TIMEOUT_IN_SECONDS = 7200
  STATEMENT_QUEUED_TIMEOUT_IN_SECONDS = 300;

アドホック用ウェアハウスは想定外の重いクエリが流れやすいため、タイムアウトを設定しておくとコストの事故を防げます。2つのパラメータは「実行中の上限」と「待ち時間の上限」という別物である点に注意してください。

✅ この節のまとめ

練習問題

問1. 夜間のデータロード処理が長引くと、朝のBIダッシュボードのクエリが遅くなるという問題が起きている。Snowflakeにおける最も適切な解決策はどれか。

  1. ロードとBIで共用しているウェアハウスのサイズを2段階上げる
  2. ロード用とBI用に別々のウェアハウスを作成し、ワークロードを分離する
  3. BIユーザーのクエリに優先度パラメータを設定する
  4. ロード処理をBIと同じウェアハウスのまま、より大きなファイルで実行する
解答と解説を見る

正解:B

Snowflakeではどのウェアハウスも同じデータにアクセスできるため、ワークロードごとにウェアハウスを分ければ相互干渉がなくなります。これが最も基本的で効果的な設計です。Aは共用のままなので競合が残り、重いロードとBIが同じキューを奪い合う構図は変わりません。Cのようなクエリ単位の優先度指定機能はありません。Dはロードの効率の話であり、干渉問題を解決しません。

問2. Query Acceleration Service(QAS)の説明として正しいものはどれか。

  1. すべてのエディションで利用でき、ウェアハウスのメモリを増強する機能である
  2. Enterprise エディション以上で利用でき、大規模スキャンの一部をサーバーレス資源にオフロードして並列処理する機能である
  3. クエリ結果をクラウドサービス層にキャッシュして再利用する機能である
  4. 同時実行クエリ数が増えたときに、クラスタ数を自動的に増やす機能である
解答と解説を見る

正解:B

QASはEnterprise以上で利用でき、対象クエリのスキャン・フィルタ処理をサーバーレス計算資源へオフロードします。scale factor でウェアハウスの何倍まで借りるかを制御し、断続的に発生する大型クエリに有効です。Aはエディション条件が誤りで、メモリ増強は Snowpark-optimized warehouse の特徴です。Cはクエリ結果キャッシュの説明です。Dはマルチクラスタウェアハウスの説明です。

問3. STATEMENT_QUEUED_TIMEOUT_IN_SECONDS を設定した場合の動作として正しいものはどれか。

  1. 実行中のクエリが指定秒数を超えると強制的にキャンセルされる
  2. キューでの待機が指定秒数を超えたクエリが、キューから取り除かれる
  3. ウェアハウスがアイドル状態のまま指定秒数が経過するとサスペンドされる
  4. 指定秒数ごとにキューの内容が再優先順位付けされる
解答と解説を見る

正解:B

STATEMENT_QUEUED_TIMEOUT_IN_SECONDS は「キュー待ち時間の上限」で、超過したクエリはキューから除去されます。定期更新のダッシュボードクエリなど、遅れて実行しても意味のないクエリの滞留防止に使います。Aは STATEMENT_TIMEOUT_IN_SECONDS(実行時間の上限)の説明で、2つの区別がこの問題の論点です。Cは AUTO_SUSPEND の説明です。Dのような再優先順位付けの機能はありません。

問4. 次のうち、スケールアップ(ウェアハウスサイズの変更)が適切な場面と、スケールアウト(マルチクラスタ)が適切な場面の組み合わせとして正しいものはどれか。

  1. アップ:同時接続ユーザーの増加/アウト:単一の複雑クエリのスピル解消
  2. アップ:単一の複雑クエリのスピル解消/アウト:同時接続ユーザー増加によるキュー待ちの解消
  3. アップ:キュー待ち時間の短縮/アウト:キュー待ち時間の短縮(どちらでも同じ)
  4. アップ:ストレージ容量の拡張/アウト:メタデータキャッシュの拡張
解答と解説を見る

正解:B

サイズアップは1クラスタあたりの計算資源(ノード数・メモリ)を増やすため、個々の重いクエリ・スピルに効きます。マルチクラスタはクラスタ数を増やして同時実行を捌くため、キュー待ちに効きます。Aは対応が逆です。Cは誤りで、キュー待ちにはスケールアウトが適切であり、サイズアップではキューは解消しません。Dは誤りで、ストレージはコンピュートと独立しており、ウェアハウス設定とは無関係です。