Snowflakeの3つのキャッシュの違い|リザルト・ウェアハウス・メタデータをやさしく解説

Snowflakeの3つのキャッシュの違い|リザルト・ウェアハウス・メタデータをやさしく解説 Snowflake

はじめに:Snowflakeのクエリが「2回目から爆速」になる理由

Snowflakeを触っていると、「同じクエリを2回目に実行したら一瞬で終わった!」という経験をしたことがありませんか?これは偶然ではなく、Snowflakeが裏側で動かしている 3種類のキャッシュ のおかげなんです。

この記事では、初心者の方に向けて リザルトキャッシュ・ウェアハウスキャッシュ・メタデータキャッシュ の違いを、できるだけかみくだいて解説していきます。違いを理解すると、コスト削減やパフォーマンス改善にもつながりますよ!

Snowflakeの3つのキャッシュの違い|リザルト・ウェアハウス・メタデータをやさしく解説

キャッシュとは?ざっくり一言で

キャッシュとは「一度計算した結果を一時的に取っておいて、同じ問い合わせが来たら使い回す仕組み」のこと。毎回ゼロから計算するより、保存した結果を返すほうがずっと速いですよね。Snowflakeはこの仕組みを3つの層で持っています。

① リザルトキャッシュ(Result Cache)

これは クエリの「最終結果」そのものを丸ごと保存 しておくキャッシュです。アカウント全体で共有され、保持期間は最大24時間(再アクセスされる度に延長され最大31日)。

  • 場所: クラウドサービス層
  • 条件: 同じSQL、同じユーザーロール権限、対象テーブルが変更されていないこと
  • ウェアハウスを起動せずに結果を返すため、コストはほぼゼロ!
-- リザルトキャッシュを無効にしたいときはこう
ALTER SESSION SET USE_CACHED_RESULT = FALSE;

-- 確認するときはクエリ履歴で「Bytes scanned = 0」かをチェック
SELECT query_id, execution_status, bytes_scanned
FROM TABLE(INFORMATION_SCHEMA.QUERY_HISTORY())
ORDER BY start_time DESC;

② ウェアハウスキャッシュ(ローカルディスクキャッシュ)

こちらは各 仮想ウェアハウスのSSDに、テーブルから読み込んだデータの断片(マイクロパーティション)を一時保存 するキャッシュです。

  • 場所: 仮想ウェアハウスのSSD
  • 対象: そのウェアハウスを使ったクエリのみ
  • 注意: ウェアハウスをサスペンド(停止)するとキャッシュは消える

例えば毎朝似たような集計を行うダッシュボード用ウェアハウスは、AUTO_SUSPENDを長めにすると2回目以降のクエリが速くなります(ただしクレジットとのバランスが大事)。

② ウェアハウスキャッシュ(ローカルディスクキャッシュ)の解説図

③ メタデータキャッシュ(Metadata Cache)

Snowflakeは各テーブルの「行数」「最小値・最大値」「NULL数」などの統計情報(メタデータ)をクラウドサービス層に常に保持しています。これを使うことで、ウェアハウスを起動せずに即答できるクエリがあるんです。

-- これらは多くの場合メタデータだけで応答=ウェアハウス不要
SELECT COUNT(*) FROM sales;
SELECT MIN(order_date), MAX(order_date) FROM sales;
SELECT SYSTEM$CLUSTERING_INFORMATION('sales');

「ウェアハウスを停止したまま COUNT(*) が返ってくる!」というのは、このメタデータキャッシュのおかげなんですね。

3つの違いを整理

  • リザルトキャッシュ:結果まるごと再利用 / アカウント全体で共有 / 24時間
  • ウェアハウスキャッシュ:データ断片を再利用 / ウェアハウス単位 / サスペンドで消える
  • メタデータキャッシュ:統計情報を即答 / クラウドサービス層 / 常時

キャッシュが効いているか確認する方法

Snowsightの Query Profile を開くと、画面右の統計情報に「Scan progress」「Percentage scanned from cache」などが表示されます。ここで何%がキャッシュから読まれたかが一目瞭然です。詳しい見方はSnowflakeクエリプロファイル入門もあわせて読んでみてください。

注意点とコツ

  • テーブルが更新されるとリザルトキャッシュは即無効化されます
  • CURRENT_TIMESTAMP() など毎回値が変わる関数を含むクエリはリザルトキャッシュ対象外
  • ウェアハウスをやたら停止/起動するとキャッシュが効きにくくなります

まとめ

Snowflakeの3つのキャッシュは、それぞれ 担当する層と効き方が違う のがポイント。「同じ結果を返すならリザルト」「同じデータをよく見るならウェアハウス」「集計の答えだけ欲しいならメタデータ」と覚えておくと、パフォーマンスチューニングもコスト最適化もぐっとラクになりますよ。

参考リンク

関連記事