Snowflake

Query Profileの使い方|Snowflakeクエリパフォーマンス分析

2026-03-21
更新: 2026-03-27
NicheeLab編集部

Query Profileは、Snowflakeのクエリ実行計画と実行統計を視覚的に確認できるパフォーマンス分析ツールです。 SnowsightのUIでオペレーターごとの処理時間・スキャンしたパーティション数・Spill量を確認し、ボトルネックを特定できます。

この記事では、Snowsight UIでのQuery Profileの見方・Most Expensive Nodesの特定方法・パーティションプルーニングの確認・Spill分析・ボトルネック特定フローを解説します。SnowPro試験のPerformance Conceptsドメインで頻出するトピックです。

Query Profileへのアクセス方法

Query ProfileはSnowsight(WebUI)で確認します。

  1. Snowsightの左メニューから「Activity」→「Query History」を開く
  2. 分析対象のクエリを検索してクリック
  3. 「Query Profile」タブを選択するとDAGビュー(有向非巡回グラフ)が表示される

WorksheetでSQLを実行した場合は、結果タブの横にある「Query Profile」リンクから直接アクセスできます。SQLでQuery Profileの統計情報を取得するにはGET_QUERY_OPERATOR_STATS()テーブル関数を使用します。

-- SQLでQuery Profileの統計情報を取得
SELECT *
FROM TABLE(GET_QUERY_OPERATOR_STATS('01b2c3d4-0001-abcd-0000-00012345abcd'));

DAGビューの構成要素

Query Profileは各処理をオペレーター(ノード)として表示し、データの流れを矢印で接続したDAG(有向非巡回グラフ)として表現します。

オペレーター説明確認ポイント
TableScanテーブルからのデータ読み取りPartitions Scanned vs Total Partitions(プルーニング効率)
JoinFilterJOIN処理Rows Produced・Spill量
FilterWHERE句によるフィルタリング入力行数 vs 出力行数(選択率)
SortORDER BY処理Spill量(メモリ不足の兆候)
AggregateGROUP BY・集約関数カーディナリティ・Spill量
Result最終結果の出力Rows Produced
WithClause / WithReferenceCTEの処理CTE結果の再利用回数

Most Expensive Nodesの特定

Snowsightではクエリ全体の処理時間に対する各ノードの占有率をパーセンテージで表示し、最もリソースを消費したノードを色付きで強調表示します。

ボトルネックの原因パターン

Most Expensiveの原因Query Profileでの兆候対処法
フルテーブルスキャンPartitions Scanned = Total PartitionsWHERE句の追加・クラスタリングキーの設定
大規模JOIN爆発JoinFilterのRows Producedが入力より大幅増加JOIN条件の見直し・フィルタの前方移動
Remote SpillBytes Spilled to Remote Storageが大きいWarehouseサイズアップ・クエリ最適化
ソートの大量データ処理SortのSpill量が大きい不要なORDER BYの削除・LIMITの追加

パーティションプルーニングの確認

パーティションプルーニングは、WHERE句の条件に基づいて不要なマイクロパーティションの読み取りをスキップする最適化です。Query ProfileのTableScanオペレーターで以下の値を確認します。

  • Partitions Totalテーブル全体のパーティション数
  • Partitions Scanned実際にスキャンしたパーティション数

Partitions Scanned / Partitions Totalの比率が低いほどプルーニングが効いています。比率が100%に近い場合、クラスタリングキーの設定が効果的です。

-- プルーニング効果の確認例
-- WHERE句のカラムにクラスタリングキーを設定
ALTER TABLE large_events CLUSTER BY (event_date);

-- クラスタリング状態の確認
SELECT SYSTEM$CLUSTERING_INFORMATION('large_events', '(event_date)');

Spill分析

Spillは、クエリ実行時にメモリに収まりきらないデータがディスクに書き出される現象で、パフォーマンス劣化の主要原因です。

Spillの種類書き出し先パフォーマンス影響対処法
Local SpillWarehouseのローカルSSD中程度の遅延Warehouseサイズアップ
Remote Spillクラウドストレージ(S3/Blob/GCS)深刻な遅延大幅なサイズアップまたはクエリ再設計

Query Profileの各オペレーターでBytes Spilled to Local StorageBytes Spilled to Remote Storageの値を確認します。Remote Spillが発生している場合は、Warehouseのサイズアップが最優先の対処法です。

ボトルネック特定フロー

  1. Query Profileを開く — SnowsightのQuery HistoryまたはWorksheetから対象クエリを選択
  2. Most Expensive Nodesを確認 — DAGビューで色付きで強調されたノードを特定
  3. Spillの有無を確認 — Bytes Spilled to Local/Remote Storageが0でないか確認
  4. パーティションプルーニングを確認 — TableScanのPartitions Scanned vs Total比率をチェック
  5. 対策を実施 — サイズアップ・クラスタリングキー設定・クエリ最適化のいずれかを適用
  6. 改善を確認 — 同じクエリを再実行してQuery Profileで改善を確認

SQLによるクエリ分析

-- 直近24時間で実行時間が長いクエリ上位10件
SELECT query_id, query_text, total_elapsed_time / 1000 AS elapsed_sec,
       bytes_spilled_to_local_storage, bytes_spilled_to_remote_storage,
       partitions_scanned, partitions_total
FROM snowflake.account_usage.query_history
WHERE start_time > DATEADD(hour, -24, CURRENT_TIMESTAMP())
  AND execution_status = 'SUCCESS'
ORDER BY total_elapsed_time DESC
LIMIT 10;

問題例

Query Profile

問題 1

Snowflake Query ProfileでTableScanオペレーターの「Partitions Scanned = 1,000 / Partitions Total = 1,000」と表示された場合、最も適切な対処法はどれですか?

  1. Virtual Warehouseのサイズをアップして処理速度を向上させる
  2. Result Cacheを有効にして同じクエリの再実行を高速化する
  3. WHERE句で頻繁にフィルタするカラムにクラスタリングキーを設定し、パーティションプルーニング効率を向上させる
  4. マルチクラスターWarehouseを有効にしてスケールアウトする

正解: C

Partitions Scanned = Partitions Total(プルーニング率0%)は、WHERE句の条件によるパーティションの絞り込みが全く効いていないことを示しています。この場合、WHERE句で頻繁に使用するカラムにクラスタリングキーを設定することで、マイクロパーティション内のデータが再配置され、プルーニング効率が大幅に向上します。Warehouseのサイズアップ(A)は読み取りの並列度を上げますがスキャン量は減りません。Result Cache(B)は同一クエリの再実行時のみ有効で根本解決になりません。スケールアウト(D)は同時実行性の改善であり、単一クエリのスキャン効率には影響しません。

Query Profileの問題を解こう

日本語問題集でSnowPro試験の実力チェック

無料で問題を解く

よくある質問(FAQ)

Query Profileはどこからアクセスできますか?

Query ProfileはSnowsight(WebUI)のQuery Historyから確認できます。Snowsightで「Activity」→「Query History」を開き、分析対象のクエリをクリックすると「Query Profile」タブが表示されます。SnowsightのWorksheetでクエリを実行した場合は、結果タブの横にある「Query Profile」リンクからも直接アクセスできます。SnowSQLやJDBC/ODBCクライアントからは直接Query Profileにアクセスできませんが、GET_QUERY_OPERATOR_STATS()テーブル関数を使えばQuery Profileの各オペレーターの統計情報をSQLで取得できます。

Spillとは何ですか?パフォーマンスにどう影響しますか?

Spillは、クエリ実行時にメモリ(RAM)に収まりきらないデータが発生した場合にローカルディスクまたはリモートストレージ(S3/Azure Blob/GCS)にデータを一時的に書き出す現象です。Local Spillはローカルディスクへの書き出し、Remote Spillはクラウドストレージへの書き出しです。Remote SpillはLocal Spillより大幅に遅く、クエリパフォーマンスに深刻な影響を与えます。Query ProfileでSpillが確認された場合の対処法は、(1)Warehouseのサイズアップ(メモリ増加)、(2)クエリの最適化(JOINの削減・フィルタ条件の追加)、(3)クラスタリングキーの設定によるスキャンデータの削減です。

Most Expensive Nodesとは何ですか?

Most Expensive Nodesは、Query Profile内で最もリソースを消費しているオペレーター(処理ノード)を示す指標です。Snowsightでは処理時間や消費リソースが大きいノードが色付きで強調表示されます。一般的にMost Expensiveになりやすいのは、フルテーブルスキャン(TableScan)・大規模JOIN(JoinFilter)・ソート(Sort)・集約(Aggregate)です。ボトルネック改善では、まずMost Expensive Nodeを特定し、そのノードのPartitions Scanned/Total比率・Spill量・Bytes Sentを確認して原因を特定するフローが推奨されます。

Query Profile 関連記事

Virtual Warehouse完全解説

Warehouseのサイズ・スケーリング・コスト最適化

クラスタリングキー完全解説

クラスタリングキーの設定と効果の確認方法

Result Cache完全解説

3種類のキャッシュの仕組みと使い分け

この記事で学んだ内容を問題で確認しましょう

16,000問以上の問題で実力チェック

無料で問題を解いてみる
この記事の著者

NicheeLab編集部

データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。


関連記事
Snowflake

Snowflake資格一覧|全11試験(SnowPro)の難易度・費用

Snowflake認定資格(SnowPro)全11試験の一覧・難易度・費用・出題範囲を徹底解説。...

Snowflake

Snowflake試験の難易度ランキング|全11資格を徹底比較

Snowflake(SnowPro)認定全11試験の難易度をランキング形式で比較。学習時間・合格に必要なスキルから分析。...

Snowflake

Snowflake資格の勉強方法|効率的な学習ルートと合格のコツ

Snowflake認定資格(SnowPro)に最短で合格するための勉強方法。公式リソース・学習スケジュールを徹底ガイド。...

Snowflake

SnowPro Core試験完全解説|出題範囲・問題例・合格戦略

SnowPro Core Certification(COF-C03)を徹底解説。出題範囲・100問の試験形式・合格ライ...

Snowflake

SnowPro Platform Associate完全解説|入門試験の攻略

SnowPro Associate: Platform Certification(SOL-C01)を徹底解説。最も簡単...

Snowflakeの記事一覧 (102件)
© 2026 NicheeLab All rights reserved.