Snowflakeにおけるキャッシュの仕組み

Snowflakeにおけるデータパイプラインの自動化

Emily Melhuish

Technical Curriculum Developer, Snowflake

3つのキャッシュ層

キャッシュ層の概要図

Snowflakeは3つのレベルでクエリ結果をキャッシュします — それぞれスコープと保持期間が異なります

  • 結果キャッシュ — クエリの完全な結果を保存し、ウェアハウスを起動せずに返します
  • ウェアハウスキャッシュ(データキャッシュ) — 最近スキャンされたマイクロパーティションをメモリとSSDに保持
  • メタデータキャッシュ — 常時有効。クエリ計画で使用されるテーブル統計を保持
Snowflakeにおけるデータパイプラインの自動化

結果キャッシュが使用される条件(と使用されない条件)

クエリがキャッシュから即時返却されるSnowflakeクエリ結果キャッシュのフロー図

条件 キャッシュミスとなる場合
クエリテキストが完全一致 大文字小文字・空白・エイリアスが異なる
再利用不可な関数を含まない 実行ごとに変わる関数(例:RANDOM)を使用
基となるテーブルに変更なし 前回実行後にDML・再クラスタリング・統合が行われた
永続化された結果が有効期間内 再利用なしで24時間のTTLが経過、または31日経過
ロールに必要な権限がある SELECT: ロールに権限なし SHOW: 異なるロール
Snowflakeにおけるデータパイプラインの自動化

ウェアハウスキャッシュとメタデータキャッシュ

ウェアハウスキャッシュのヒットとミスのシナリオを示すSnowflakeデータキャッシュ図

ウェアハウスキャッシュ

  • 最近スキャンされたマイクロパーティションをウェアハウスのSSD+メモリに保持
  • ウェアハウスが一時停止するとクリアされる
  • キャッシュを維持するために自動停止の時間を十分に確保する

メタデータキャッシュ

  • 常時有効。クラウドサービス層に存在
  • テーブル統計を保持
  • メタデータのみで応答できるクエリもある
Snowflakeにおけるデータパイプラインの自動化

パーティションプルーニングを妨げるSQLパターン

プルーニング不可:

SELECT *
FROM logistics.shipments
WHERE MONTH(dispatch_date) = 3;

プルーニング可能:

SELECT *
FROM logistics.shipments
WHERE dispatch_date >= '2024-03-01'
  AND dispatch_date <  '2024-04-01';
Snowflakeにおけるデータパイプラインの自動化

避けるべきSQLパターンのまとめ

SELECT * を避ける

-- Reads every column
SELECT * 
FROM logistics.shipments 
WHERE region = 'EMEA';

-- Reads only what's needed
SELECT shipment_id
, delivery_days 
FROM logistics.shipments 
WHERE region = 'EMEA';

暗黙的なクロス結合を避ける

-- Missing join condition = Cartesian
SELECT s.shipment_id
, c.name 
FROM shipments s, carriers c;

-- Explicit JOIN with ON condition
SELECT s.shipment_id
, c.name 
FROM shipments s 
JOIN carriers c ON s.carrier_id = c.id;
Snowflakeにおけるデータパイプラインの自動化

さあ、練習しましょう!

Snowflakeにおけるデータパイプラインの自動化

Preparing Video For Download...