Query Profileは、Snowflakeのクエリ実行計画と実行統計を視覚的に確認できるパフォーマンス分析ツールです。 SnowsightのUIでオペレーターごとの処理時間・スキャンしたパーティション数・Spill量を確認し、ボトルネックを特定できます。
この記事では、Snowsight UIでのQuery Profileの見方・Most Expensive Nodesの特定方法・パーティションプルーニングの確認・Spill分析・ボトルネック特定フローを解説します。SnowPro試験のPerformance Conceptsドメインで頻出するトピックです。
Query ProfileはSnowsight(WebUI)で確認します。
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'));Query Profileは各処理をオペレーター(ノード)として表示し、データの流れを矢印で接続したDAG(有向非巡回グラフ)として表現します。
| オペレーター | 説明 | 確認ポイント |
|---|---|---|
| TableScan | テーブルからのデータ読み取り | Partitions Scanned vs Total Partitions(プルーニング効率) |
| JoinFilter | JOIN処理 | Rows Produced・Spill量 |
| Filter | WHERE句によるフィルタリング | 入力行数 vs 出力行数(選択率) |
| Sort | ORDER BY処理 | Spill量(メモリ不足の兆候) |
| Aggregate | GROUP BY・集約関数 | カーディナリティ・Spill量 |
| Result | 最終結果の出力 | Rows Produced |
| WithClause / WithReference | CTEの処理 | CTE結果の再利用回数 |
Snowsightではクエリ全体の処理時間に対する各ノードの占有率をパーセンテージで表示し、最もリソースを消費したノードを色付きで強調表示します。
| Most Expensiveの原因 | Query Profileでの兆候 | 対処法 |
|---|---|---|
| フルテーブルスキャン | Partitions Scanned = Total Partitions | WHERE句の追加・クラスタリングキーの設定 |
| 大規模JOIN爆発 | JoinFilterのRows Producedが入力より大幅増加 | JOIN条件の見直し・フィルタの前方移動 |
| Remote Spill | Bytes Spilled to Remote Storageが大きい | Warehouseサイズアップ・クエリ最適化 |
| ソートの大量データ処理 | SortのSpill量が大きい | 不要なORDER BYの削除・LIMITの追加 |
パーティションプルーニングは、WHERE句の条件に基づいて不要なマイクロパーティションの読み取りをスキップする最適化です。Query ProfileのTableScanオペレーターで以下の値を確認します。
Partitions Scanned / Partitions Totalの比率が低いほどプルーニングが効いています。比率が100%に近い場合、クラスタリングキーの設定が効果的です。
-- プルーニング効果の確認例
-- WHERE句のカラムにクラスタリングキーを設定
ALTER TABLE large_events CLUSTER BY (event_date);
-- クラスタリング状態の確認
SELECT SYSTEM$CLUSTERING_INFORMATION('large_events', '(event_date)');Spillは、クエリ実行時にメモリに収まりきらないデータがディスクに書き出される現象で、パフォーマンス劣化の主要原因です。
| Spillの種類 | 書き出し先 | パフォーマンス影響 | 対処法 |
|---|---|---|---|
| Local Spill | WarehouseのローカルSSD | 中程度の遅延 | Warehouseサイズアップ |
| Remote Spill | クラウドストレージ(S3/Blob/GCS) | 深刻な遅延 | 大幅なサイズアップまたはクエリ再設計 |
Query Profileの各オペレーターでBytes Spilled to Local StorageとBytes Spilled to Remote Storageの値を確認します。Remote Spillが発生している場合は、Warehouseのサイズアップが最優先の対処法です。
-- 直近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」と表示された場合、最も適切な対処法はどれですか?
正解: C
Partitions Scanned = Partitions Total(プルーニング率0%)は、WHERE句の条件によるパーティションの絞り込みが全く効いていないことを示しています。この場合、WHERE句で頻繁に使用するカラムにクラスタリングキーを設定することで、マイクロパーティション内のデータが再配置され、プルーニング効率が大幅に向上します。Warehouseのサイズアップ(A)は読み取りの並列度を上げますがスキャン量は減りません。Result Cache(B)は同一クエリの再実行時のみ有効で根本解決になりません。スケールアウト(D)は同時実行性の改善であり、単一クエリのスキャン効率には影響しません。
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を確認して原因を特定するフローが推奨されます。
NicheeLab編集部
データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。
Snowflake資格一覧|全11試験(SnowPro)の難易度・費用
Snowflake認定資格(SnowPro)全11試験の一覧・難易度・費用・出題範囲を徹底解説。...
Snowflake試験の難易度ランキング|全11資格を徹底比較
Snowflake(SnowPro)認定全11試験の難易度をランキング形式で比較。学習時間・合格に必要なスキルから分析。...
Snowflake資格の勉強方法|効率的な学習ルートと合格のコツ
Snowflake認定資格(SnowPro)に最短で合格するための勉強方法。公式リソース・学習スケジュールを徹底ガイド。...
SnowPro Core試験完全解説|出題範囲・問題例・合格戦略
SnowPro Core Certification(COF-C03)を徹底解説。出題範囲・100問の試験形式・合格ライ...
SnowPro Platform Associate完全解説|入門試験の攻略
SnowPro Associate: Platform Certification(SOL-C01)を徹底解説。最も簡単...