Snowflakeはクエリパフォーマンスの最適化のために3種類のキャッシュを自動的に管理しています。Result Cache(Cloud Servicesレイヤー)、Metadata Cache(Cloud Servicesレイヤー)、Warehouse Cache(コンピュートレイヤーのSSD)の動作レイヤーと無効化条件を正確に理解することは、パフォーマンスチューニングとSnowPro試験の両面で重要です。
| 項目 | Result Cache | Metadata Cache | Warehouse Cache |
|---|---|---|---|
| 別名 | Query Result Cache | Cloud Services Cache | Local Disk Cache / SSD Cache |
| 動作レイヤー | Cloud Servicesレイヤー | Cloud Servicesレイヤー | コンピュートレイヤー(WH内SSD) |
| キャッシュ対象 | クエリの最終結果セット | テーブルのメタデータ(行数・MIN/MAX等) | マイクロパーティションのローデータ |
| 保持期間 | 24時間(再利用で延長) | 永続的(データ変更まで) | ウェアハウス稼働中のみ |
| WH必要性 | 不要(WHなしで返却) | 不要(WHなしで返却) | 必要(WH上のSSD) |
| クレジット消費 | なし(Cloud Services枠内) | なし(Cloud Services枠内) | ウェアハウスクレジット消費 |
| 無効化条件 | テーブル変更 / 24時間経過 / SQL相違 | テーブルのDDL・DML変更 | ウェアハウスのサスペンド |
Result Cacheは、過去24時間以内に実行された同一SQLクエリの結果セットを保持し、同じクエリが再実行された際にウェアハウスを経由せず即座に結果を返す仕組みです。
クエリ実行フロー(Result Cache あり):
[SQL: SELECT region, SUM(amount) FROM sales GROUP BY region]
│
▼
[Cloud Services レイヤー]
│
├─ Result Cache にヒット?
│ │
│ ├─ YES → キャッシュから即座に返却(WH不使用・クレジット消費なし)
│ │
│ └─ NO → ウェアハウスでクエリ実行
│ │
│ └─ 結果を返却 + Result Cache に保存(24時間)
▼
[クエリ結果]| 無効化条件 | 詳細 |
|---|---|
| テーブルデータの変更 | INSERT/UPDATE/DELETE/MERGEで対象テーブルのデータが変更された場合 |
| 24時間の経過 | 前回クエリ実行から24時間が経過(再利用されると24時間延長) |
| SQL文の相違 | 空白・コメント・大小文字が1文字でも異なる場合 |
| USE_CACHED_RESULT = FALSE | セッションパラメータで明示的に無効化 |
| 非確定的関数 | CURRENT_TIMESTAMP()、RANDOM()、UUID_STRING()等を含むクエリ |
| 外部関数 | External Functionを含むクエリ |
-- Result Cacheを無効化してクエリ実行
ALTER SESSION SET USE_CACHED_RESULT = FALSE;
SELECT region, SUM(amount) FROM sales GROUP BY region;
-- → 必ずウェアハウスで再実行される
-- Result Cacheを再有効化
ALTER SESSION SET USE_CACHED_RESULT = TRUE;Metadata Cacheは、テーブルのメタデータ(行数、バイトサイズ、各マイクロパーティションのMIN/MAX値等)をCloud Servicesレイヤーに保持する仕組みです。メタデータだけで回答可能なクエリはウェアハウスを使わずに結果を返します。
-- Metadata Cacheで即座に回答されるクエリ例
SELECT COUNT(*) FROM large_table; -- 行数はメタデータで保持
SELECT MIN(id) FROM large_table; -- MIN/MAXはパーティションメタデータで保持
SELECT MAX(created_at) FROM large_table;
-- これらのクエリはウェアハウスが SUSPENDED でも実行可能
-- Query Profile で "METADATA-BASED RESULT" と表示されるWarehouse Cacheは、ウェアハウスのコンピュートノードに搭載されたSSD上にマイクロパーティションのローデータをキャッシュする仕組みです。リモートストレージ(S3/Azure Blob/GCS)からのI/Oを削減し、クエリの実行時間を短縮します。
クエリ実行フロー(Warehouse Cache あり):
[SQL: SELECT * FROM sales WHERE region = 'APAC']
│
▼
[ウェアハウスのコンピュートノード]
│
├─ 必要なマイクロパーティションがSSD上にキャッシュされている?
│ │
│ ├─ YES → SSDからローカル読み込み(高速)
│ │
│ └─ NO → リモートストレージ(S3等)から読み込み
│ │
│ └─ 読み込んだデータをSSDにキャッシュ
▼
[クエリ結果]| 特性 | 説明 |
|---|---|
| キャッシュの持続 | ウェアハウスが稼働(RUNNING)中はキャッシュが維持される |
| サスペンド時 | ウェアハウスをSUSPENDするとキャッシュがクリアされる |
| リサイズ時 | スケールアップでノード追加分は空キャッシュ。既存ノードのキャッシュは維持 |
| LRU方式 | SSD容量上限に達すると、最も古くアクセスされたデータが新データに置き換えられる |
| マルチクラスター | 各クラスターが独立したキャッシュを持つ |
キャッシュ評価の優先順位:
[SQLクエリ受信]
│
▼
[1] Metadata Cache チェック
│ メタデータだけで回答可能?(COUNT(*), MIN, MAX等)
│ ├─ YES → 即座に返却(WH不要)
│ └─ NO → 次のステップへ
▼
[2] Result Cache チェック
│ 同一SQL + 同一ロール + 24時間以内 + データ未変更?
│ ├─ YES → キャッシュ結果を返却(WH不要)
│ └─ NO → 次のステップへ
▼
[3] ウェアハウスで実行(Warehouse Cache を活用)
│ 必要なマイクロパーティションがSSD上にあれば高速読み込み
│ なければリモートストレージから読み込み + SSDにキャッシュ
▼
[クエリ結果返却 + Result Cache に保存]ウェアハウスのAUTO_SUSPEND設定はWarehouse Cacheの有効性に大きく影響します。
-- Query Profileで確認できるキャッシュ関連指標
Result Cache ヒット時:
→ Query Profile に "QUERY RESULT REUSE" と表示
→ ウェアハウスの処理ノードが表示されない
Metadata Cache ヒット時:
→ Query Profile に "METADATA-BASED RESULT" と表示
Warehouse Cache 利用時:
→ Statistics タブで以下を確認
- Percentage Scanned from Cache: SSDキャッシュからの読み込み割合
- Bytes Scanned from Cache: キャッシュから読み込んだバイト数
-- Warehouse Cacheの効果を比較するクエリ
-- 1回目: リモートストレージから読み込み(Percentage Scanned from Cache = 0%)
-- 2回目: SSDキャッシュから読み込み(Percentage Scanned from Cache ≒ 100%)Cache
問題 1
あるユーザーが同じSELECT文を5分前にROLE_Aで実行し、今回ROLE_Bで再実行した。対象テーブルのデータは変更されていない。この場合のResult Cacheの動作として正しいものはどれか?
正解: B
Result Cacheはクエリを実行したロール(ROLE)ごとに管理されます。同じSQL文でも異なるロールで実行した場合はResult Cacheはヒットせず、ウェアハウスで再実行されます。これはロールによってRow Access PolicyやMasking Policyの適用結果が異なる可能性があるためです。
Result Cacheからクエリ結果が返された場合、ウェアハウスのクレジットは消費されますか?
いいえ。Result Cache(Query Result Cache)はCloud Servicesレイヤーで管理され、ウェアハウスを経由せずに結果が返されます。そのためウェアハウスのクレジット消費は発生しません。ただし、Cloud Servicesレイヤーの利用量がウェアハウスのクレジット消費の10%を超えた分は課金対象になるため、完全に無料というわけではありません。
Result Cacheが無効化されるのはどのような場合ですか?
Result Cacheは以下の条件で無効化されます: (1) 対象テーブルのデータが変更された(INSERT/UPDATE/DELETE/MERGE)場合、(2) 24時間が経過した場合、(3) クエリのSQL文が1文字でも異なる場合、(4) ユーザーがUSE_CACHED_RESULT = FALSEを設定した場合。また、ランダム関数(RANDOM()等)や非確定的関数(CURRENT_TIMESTAMP()等)を含むクエリはResult Cacheの対象外です。
Warehouse CacheとResult Cacheの違いを簡潔に教えてください
Result Cacheはクエリの最終結果セットをCloud Servicesレイヤーに24時間保持する仕組みで、同一SQLが再実行されると即座に返します。Warehouse Cache(Local Disk Cache)はウェアハウスのSSDに読み込んだマイクロパーティションのローデータをキャッシュする仕組みで、異なるクエリでも同じテーブルデータにアクセスする場合にリモートストレージへのI/Oを削減します。Warehouse Cacheはウェアハウスが稼働中のみ有効で、サスペンドするとクリアされます。
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)を徹底解説。最も簡単...