SnowflakeのQUERY_HISTORYは、実行されたクエリの詳細な 実行統計を提供する機能で、性能分析・ボトルネック特定・コスト最適化に不可欠です。INFORMATION_SCHEMAのテーブル関数とACCOUNT_USAGEのビューの2つの取得方法があり、 遅延・保持期間・権限モデルが異なります。
QUERY_HISTORYには取得先が2つあります。 試験ではこの違いを正確に問われるため、以下の比較を押さえてください。
| 比較項目 | INFORMATION_SCHEMA.QUERY_HISTORY() | ACCOUNT_USAGE.QUERY_HISTORY |
|---|---|---|
| 種別 | テーブル関数 | ビュー |
| 保持期間 | 直近7日間 | 365日間 |
| データ遅延 | なし(リアルタイム) | 最大45分 |
| 最大取得件数 | 10,000件(RESULT_LIMIT) | 制限なし |
| スコープ | 現在のロールで実行権限があるクエリ | アカウント全体の全クエリ |
| 必要権限 | 特別な権限不要(ロール範囲内) | SNOWFLAKE DBのIMPORTED PRIVILEGES |
| 呼び出し方法 | SELECT * FROM TABLE(INFORMATION_SCHEMA.QUERY_HISTORY(...)) | SELECT * FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY |
テーブル関数として呼び出し、名前付きパラメータで期間やユーザーを絞り込みます。
-- 直近1時間のクエリ履歴を取得
SELECT *
FROM TABLE(INFORMATION_SCHEMA.QUERY_HISTORY(
DATE_RANGE_START => DATEADD('HOUR', -1, CURRENT_TIMESTAMP()),
DATE_RANGE_END => CURRENT_TIMESTAMP(),
RESULT_LIMIT => 100
))
ORDER BY START_TIME DESC;
-- 特定ユーザーのクエリ履歴
SELECT
QUERY_ID,
QUERY_TEXT,
TOTAL_ELAPSED_TIME,
BYTES_SCANNED,
ROWS_PRODUCED,
WAREHOUSE_NAME
FROM TABLE(INFORMATION_SCHEMA.QUERY_HISTORY_BY_USER(
USER_NAME => 'ANALYST_USER',
RESULT_LIMIT => 50
))
ORDER BY TOTAL_ELAPSED_TIME DESC;
-- 特定ウェアハウスのクエリ履歴
SELECT *
FROM TABLE(INFORMATION_SCHEMA.QUERY_HISTORY_BY_WAREHOUSE(
WAREHOUSE_NAME => 'ANALYTICS_WH',
RESULT_LIMIT => 50
));長期間の分析やアカウント全体の俯瞰にはACCOUNT_USAGEビューを使います。 最大45分の遅延がある点を理解し、リアルタイム監視にはINFORMATION_SCHEMAを使い分けます。
-- 過去30日のクエリ統計サマリ
SELECT
USER_NAME,
WAREHOUSE_NAME,
COUNT(*) AS query_count,
AVG(TOTAL_ELAPSED_TIME) / 1000 AS avg_elapsed_sec,
SUM(BYTES_SCANNED) / POWER(1024, 3) AS total_scanned_tb,
AVG(PARTITIONS_SCANNED / NULLIF(PARTITIONS_TOTAL, 0)) AS avg_scan_ratio
FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
WHERE START_TIME >= DATEADD('DAY', -30, CURRENT_TIMESTAMP())
AND EXECUTION_STATUS = 'SUCCESS'
GROUP BY USER_NAME, WAREHOUSE_NAME
ORDER BY total_scanned_tb DESC;性能ボトルネックの特定には、以下の3つの観点で分析します。
-- 過去7日で実行時間が長いTOP20
SELECT
QUERY_ID,
SUBSTR(QUERY_TEXT, 1, 200) AS query_preview,
USER_NAME,
WAREHOUSE_NAME,
WAREHOUSE_SIZE,
TOTAL_ELAPSED_TIME / 1000 AS elapsed_sec,
COMPILATION_TIME / 1000 AS compile_sec,
EXECUTION_TIME / 1000 AS exec_sec,
QUEUED_OVERLOAD_TIME / 1000 AS queue_sec,
BYTES_SCANNED / POWER(1024, 3) AS scanned_tb
FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
WHERE START_TIME >= DATEADD('DAY', -7, CURRENT_TIMESTAMP())
AND EXECUTION_STATUS = 'SUCCESS'
AND QUERY_TYPE = 'SELECT'
ORDER BY TOTAL_ELAPSED_TIME DESC
LIMIT 20;-- プルーニング効率が50%未満(スキャン率が50%超)のクエリ
SELECT
QUERY_ID,
SUBSTR(QUERY_TEXT, 1, 200) AS query_preview,
PARTITIONS_SCANNED,
PARTITIONS_TOTAL,
ROUND(PARTITIONS_SCANNED / NULLIF(PARTITIONS_TOTAL, 0) * 100, 1) AS scan_pct,
BYTES_SCANNED / POWER(1024, 2) AS scanned_mb
FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
WHERE START_TIME >= DATEADD('DAY', -7, CURRENT_TIMESTAMP())
AND PARTITIONS_TOTAL > 100
AND PARTITIONS_SCANNED / NULLIF(PARTITIONS_TOTAL, 0) > 0.5
AND EXECUTION_STATUS = 'SUCCESS'
ORDER BY scan_pct DESC
LIMIT 20;-- キュー待ちが5秒以上のクエリ(ウェアハウス不足の兆候)
SELECT
QUERY_ID,
WAREHOUSE_NAME,
QUEUED_OVERLOAD_TIME / 1000 AS queue_sec,
QUEUED_PROVISIONING_TIME / 1000 AS provisioning_sec,
TOTAL_ELAPSED_TIME / 1000 AS elapsed_sec,
START_TIME
FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
WHERE START_TIME >= DATEADD('DAY', -7, CURRENT_TIMESTAMP())
AND QUEUED_OVERLOAD_TIME > 5000
ORDER BY QUEUED_OVERLOAD_TIME DESC
LIMIT 20;| カラム名 | 内容 | 分析での使い方 |
|---|---|---|
| TOTAL_ELAPSED_TIME | クエリの総実行時間(ms) | コストインパクトの大きいクエリ特定 |
| COMPILATION_TIME | コンパイル時間(ms) | 複雑なクエリの最適化対象特定 |
| QUEUED_OVERLOAD_TIME | ウェアハウスのキュー待ち(ms) | ウェアハウスサイズ不足の検知 |
| BYTES_SCANNED | スキャンしたデータ量 | フルスキャンの検知 |
| PARTITIONS_SCANNED / TOTAL | スキャン/全パーティション数 | プルーニング効率の評価 |
| BYTES_SPILLED_TO_LOCAL_STORAGE | ローカルディスクへのスピル | メモリ不足の検知 |
| BYTES_SPILLED_TO_REMOTE_STORAGE | リモートストレージへのスピル | 深刻なメモリ不足の検知 |
SnowPro
問題 1
アカウント管理者が過去90日間の全ユーザーのクエリ実行統計を分析したいと考えています。最も適切なデータソースはどれですか?
正解: B
INFORMATION_SCHEMA.QUERY_HISTORY()は直近7日間・最大10,000件のため90日間の分析には不向きです。ACCOUNT_USAGE.QUERY_HISTORYは365日間の全クエリ履歴を保持しており、この要件に適合します。ただしデータ反映に最大45分の遅延がある点は理解しておく必要があります。
INFORMATION_SCHEMA.QUERY_HISTORYとACCOUNT_USAGE.QUERY_HISTORYの違いは?
INFORMATION_SCHEMA.QUERY_HISTORY()はテーブル関数で、直近7日間の履歴を最大10,000件まで即時取得できます。現在のロールで実行権限があるクエリのみが表示されます。ACCOUNT_USAGE.QUERY_HISTORYはビューで、最大365日間の全アカウントの履歴を保持しますが、データ反映に最大45分の遅延があります。閲覧にはSNOWFLAKEデータベースのIMPORTED PRIVILEGES権限が必要です。
QUERY_HISTORYで最もコストが高いクエリを特定するにはどのカラムを見ますか?
直接的な「コスト」カラムはありませんが、TOTAL_ELAPSED_TIME(実行時間ms)、BYTES_SCANNED(スキャンデータ量)、PARTITIONS_SCANNED / PARTITIONS_TOTAL(プルーニング効率)の3つの指標を組み合わせてボトルネックを特定します。ウェアハウスのクレジットは時間課金のため、TOTAL_ELAPSED_TIMEが長いクエリほどコストインパクトが大きいです。
QUERY_HISTORYのデータを長期保存するにはどうすればよいですか?
ACCOUNT_USAGE.QUERY_HISTORYの保持期間は365日です。それ以上長期間保持したい場合は、定期的にCREATE TABLE AS SELECTまたはINSERT INTOで専用テーブルにコピーするタスクを作成します。日次で前日分を増分コピーするServerless Taskを組むのが一般的なパターンです。
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)を徹底解説。最も簡単...