はじめに:なぜクエリプロファイルを学ぶのか?
「同じクエリなのに、今日はやけに遅い…」「ウェアハウスを大きくしたのに速くならない…」――そんな悩みに直面したとき、最初に開くべきなのが クエリプロファイル(Query Profile) です。
クエリプロファイルとは、Snowflakeが SQLをどんな順番で・どこに時間をかけて実行したか を可視化してくれるツール。いわば「料理の調理工程ごとに何分かかったか」を見せてくれるストップウォッチのようなものです。これを読めるようになると、闇雲にウェアハウスサイズを上げる前に、本当のボトルネックを特定 できるようになります。

クエリプロファイルの基本構造
クエリプロファイルは大きく3つのパーツでできています。
- オペレーターツリー:SQLが分解されたステップ(TableScan、Join、Aggregateなど)を木構造で表示
- プロファイル概要:全体の実行時間を「処理・I/O・ネットワーク・初期化」などに分類
- ノード詳細:選択したオペレーターの統計情報(処理行数、スピル量など)
SQLの実行は 下から上に 流れます。まずテーブルからデータを読み(TableScan)、絞り込み(Filter)、結合(Join)、集計(Aggregate)…という順で、最後に結果が返ってくるイメージです。
Snowsightでの開き方
Snowsightで 「Monitoring」→「Query History」 を開き、対象のクエリIDをクリックすると、上部タブに「Query Profile」が現れます。クリックすればすぐにツリーが表示されます。

ボトルネックを見抜く3つのチェックポイント
① 「最も時間がかかっているノード」を探す
各ノードには パーセンテージ(全体に対する実行時間の割合) が表示されています。まずは50%以上を占めているノードを探しましょう。たいていそこが犯人です。
② TableScanの「Pruning(プルーニング)」をチェック
プルーニングとは「不要なマイクロパーティションを読み飛ばす機能」のこと。TableScanノードを選ぶと、こんな統計が見られます。
Partitions scanned: 980
Partitions total: 1000
もし「scanned ≒ total」なら、ほぼ全件スキャンしているということ。WHERE句で使う列にクラスタリングキーを設定したり、SEARCH OPTIMIZATIONで爆速化!Snowflakeイテレーティブテーブル活用術 で紹介した検索最適化の活用を検討してください。
③ 「Bytes Spilled to Local/Remote Storage」を確認
これが パフォーマンス殺しの代表格。メモリに収まりきらず、SSDやリモートストレージに一時データが溢れている状態を示します。特に Remote Storage へのスピルがあれば、ウェアハウスサイズを一段上げるのが効果的です。
-- 直近の重いクエリのスピル量を確認
SELECT query_id, query_text,
bytes_spilled_to_local_storage,
bytes_spilled_to_remote_storage
FROM snowflake.account_usage.query_history
WHERE bytes_spilled_to_remote_storage > 0
ORDER BY start_time DESC
LIMIT 10;
よくあるボトルネックパターン
- Joinで行数が爆発:JOIN後の行数が入力より極端に多い場合、結合キーが間違っている可能性あり。JOIN完全ガイド で結合の種類を再確認しましょう。
- Cartesian Joinの警告:プロファイルに警告が出ていれば、ON句の条件漏れを疑う。
- Window関数のSort負荷:大規模データでORDER BY指定のWindow関数が重い場合、QUALIFY句 で早めに行を絞ると改善することも。
- Queued時間が長い:プロファイル概要の「Queued」が長ければ、ウェアハウスの同時実行数オーバー。マルチクラスタを検討。
まとめ
クエリプロファイルは「遅さの原因を当てずっぽうではなく、データで証明してくれる」最強のチューニングツールです。最初は難しく見えても、「時間が長いノード」「Pruningの比率」「Spillの有無」 の3点を押さえれば十分戦えます。SELECT文の基本 と組み合わせて、ぜひ自分のクエリで開いてみてください。
参考リンク
関連記事
- SEARCH OPTIMIZATIONで爆速化!Snowflakeイテレーティブテーブル活用術 – 全件スキャン回避に効く検索最適化サービスの基本
- SnowflakeのJOIN完全ガイド|INNER/LEFT/RIGHT/FULL OUTERの使い分け – 行数爆発の原因になりがちなJOINを正しく理解
- Snowflake QUALIFY句の使い方|ウィンドウ関数の絞り込みが超簡単に – ウィンドウ関数のSort負荷を抑えるテクニック
- SnowflakeのSELECT文入門|他DBとの違いを初心者向けに解説 – チューニング前に押さえておきたいSELECTの基礎

