Snowflakeクエリプロファイル入門|遅いクエリのボトルネックを見抜く方法

Snowflakeクエリプロファイル入門|遅いクエリのボトルネックを見抜く方法 Snowflake

はじめに:なぜクエリプロファイルを学ぶのか?

「同じクエリなのに、今日はやけに遅い…」「ウェアハウスを大きくしたのに速くならない…」――そんな悩みに直面したとき、最初に開くべきなのが クエリプロファイル(Query Profile) です。

クエリプロファイルとは、Snowflakeが SQLをどんな順番で・どこに時間をかけて実行したか を可視化してくれるツール。いわば「料理の調理工程ごとに何分かかったか」を見せてくれるストップウォッチのようなものです。これを読めるようになると、闇雲にウェアハウスサイズを上げる前に、本当のボトルネックを特定 できるようになります。

Snowflakeクエリプロファイル入門|遅いクエリのボトルネックを見抜く方法

クエリプロファイルの基本構造

クエリプロファイルは大きく3つのパーツでできています。

  • オペレーターツリー:SQLが分解されたステップ(TableScan、Join、Aggregateなど)を木構造で表示
  • プロファイル概要:全体の実行時間を「処理・I/O・ネットワーク・初期化」などに分類
  • ノード詳細:選択したオペレーターの統計情報(処理行数、スピル量など)

SQLの実行は 下から上に 流れます。まずテーブルからデータを読み(TableScan)、絞り込み(Filter)、結合(Join)、集計(Aggregate)…という順で、最後に結果が返ってくるイメージです。

Snowsightでの開き方

Snowsightで 「Monitoring」→「Query History」 を開き、対象のクエリIDをクリックすると、上部タブに「Query Profile」が現れます。クリックすればすぐにツリーが表示されます。

Snowsightでの開き方の解説図

ボトルネックを見抜く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文の基本 と組み合わせて、ぜひ自分のクエリで開いてみてください。

参考リンク

関連記事