[新機能]Snowflake内で実行したクエリのパフォーマンス分析・改善提案の情報がまとまった「QUERY_INSIGHTS」ビューがリリースされました
さがらです。
Snowflakeの新機能として、Snowflake内で実行したクエリのパフォーマンス分析・改善提案の情報がまとまった「QUERY_INSIGHTS」ビューがリリースされました。
このビューを実際に試してみたので、その内容をまとめてみます。
「QUERY_INSIGHTS」ビューとは
まず「QUERY_INSIGHTS」ビューですが、Snowflake内のクエリの実行状況を分析し、パフォーマンスに影響がありそうな箇所を自動で検出した結果を保持するビューとなります。
具体的には、2025年7月15日時点では以下5種類のインサイトを提供しています。主にWHERE、JOIN、クラスタリング、リモートスピルについての情報を提示しています。
insight_type_id 列の値 |
内容 | 改善策 |
---|---|---|
QUERY_INSIGHT_INAPPLICABLE_FILTER_ON_TABLE_SCAN |
WHERE 句が全く機能しておらず、全データをスキャンしてしまっている状態。 |
より効果的な条件を追加・修正する。 |
QUERY_INSIGHT_UNSELECTIVE_FILTER |
WHERE 句の絞り込みが甘く、意図よりも多くのデータをスキャンしている状態。 |
より絞り込める条件を追加・修正する。 |
QUERY_INSIGHT_FILTER_WITH_CLUSTERING_KEY |
クラスタリングキーがフィルタリングに有効活用されている状態。このレコードだけは良いお知らせであり改善不要です。 | (改善不要) |
QUERY_INSIGHT_JOIN_WITH_NO_JOIN_CONDITION |
JOIN の結合条件が抜けており、意図しないクロスジョイン(総当たりの結合)が発生している状態。 |
正しい結合条件を指定する。 |
QUERY_INSIGHT_REMOTE_SPILLAGE |
処理データがメモリに収まらず、低速なストレージにデータが退避(スピレージ)してしまっている状態。 | より大きなウェアハウスを使うか、クエリを分割して処理データ量を減らす。 |
注意点としては、以下のケースの場合はインサイトが生成されない仕様となっています。
- セキュアオブジェクト(Secure Viewなど)を含むクエリ
- ハイブリッドテーブル(Unistore)に対するクエリ
- Native Appsが生成したクエリ
- EXPLAINクエリ
- 結果キャッシュ(Query Result Cache)を利用したクエリ
より詳細については、以下の公式Docsもご覧ください。
試してみた
シンプルに「QUERY_INSIGHTS」ビューだけをクエリ
まずはシンプルに「QUERY_INSIGHTS」ビューをクエリしてみます。
以下のクエリを実行すると、下図のように結果が返ってきます。弊社の検証環境で実行しただけなのですが、QUERY_INSIGHT_UNSELECTIVE_FILTER
に該当するクエリが見つかりました。
select query_id, insight_type_id, message, suggestions
from snowflake.account_usage.query_insights
また以下のクエリは公式Docsからの引用ですが、query hashを用いて類似クエリを検出したり、total_duration
列やwarehouse_id
列を用いることで処理時間が指定した時間を超えているものを抽出したり特定のウェアハウスに絞り込んだりすることも可能です。
- query hashを用いて類似クエリを検出
select query_id, insight_type_id, message, suggestions
from snowflake.account_usage.query_insights
where query_parameterized_hash = '4bb66effc1a3c8b4e94a728f7caaa736';
total_duration
列やwarehouse_id
列を用いて絞り込み
select query_id, insight_type_id, message, suggestions
from snowflake.account_usage.query_insights
where start_time > to_date(dateadd(day, -7, current_date()))
and total_duration > 3600000
and warehouse_id = 84412315;
他のビューと組み合わせてクエリ
「QUERY_INSIGHTS」ビューにはquery_id
列があるため、他のACCOUNT_USAGEのビューと組み合わせることが容易に可能です。
以下は生成AIにサンプルとして作成してもらったクエリですが、以下のクエリを実行すると、「直近7日間に行われたクエリで、どのユーザー・どのウェアハウスで実行されたクエリにパフォーマンスの問題がありそうか」を検出してくれます。
select
qi.query_id,
qh.user_name, -- 実行したユーザー
qh.warehouse_name, -- 使用したウェアハウス
qi.insight_type_id, -- 問題の種類
(qh.total_elapsed_time / 1000)::number(10, 2) as execution_time_sec, -- 実行時間(秒)
qi.suggestions, -- 改善提案
qh.query_text -- 実際のクエリ
from
snowflake.account_usage.query_insights as qi
join
snowflake.account_usage.query_history as qh
on qi.query_id = qh.query_id
where
-- 直近7日間のクエリを対象
qh.start_time > dateadd(day, -7, current_timestamp())
order by
execution_time_sec desc; -- 実行時間が長い順に表示
最後に
Snowflakeの新機能として、Snowflake内で実行したクエリのパフォーマンス分析・改善提案の情報がまとまった「QUERY_INSIGHTS」ビューがリリースされたので試してみました。
定期的に確認することでSnowflakeアカウント内のクエリのパフォーマンスを監視できます!有用な機能だと思いますので、ぜひご活用ください。