❄️

Snowflakeの3つのキャッシュ

1 min read

全体像

Metadata Cache

  • レイヤー:Cloud Service
  • min(), max(), count(*) などメタデータの参照だけで結果が得られる場合に使用
  • メタデータの情報のみを利用するためWarehouseは利用しない(課金もされない)
  • メタデータのみを利用しているということなのでキャッシュとは言えないのではないかという考え方もあるが、テーブルデータの代表値をメタデータとしてキャッシュしている、と考えることもできる。

Result Cache

  • レイヤー:Cloud Service
  • 同じSQLを実施した結果を再利用(ホワイトスペースの違いなどは無視して同一視してくれる)
  • 最後にキャッシュを利用してから24時間有効
  • キャッシュされている結果に関連するマイクロパーティションに変更があると無効化
  • 100kbまではCloud Serviceに保持するが、それより大きい時はクラウドストレージで保持する。しかしマイクロパーティションではないので、利用する際にWarehouseを経由するわけではない。
  • Result Cacheを返す RESULT_SCAN() というテーブル関数が存在する。SQLを発行してResult Cacheが使われたということは、SELECT * FROM TABLE( RESULT_SCAN('<query_id>') );が実行されたのと同じ。
  • パフォーマンステストでキャッシュを使用したくないときは、ALTER SESSION SET USE_CACHED_RESULT=FALSE;を発行

Data Cache

  • レイヤー:Compute Service(Virtual Warehouse)
  • 使用したマイクロパーティションをWarehouseで保持
  • LRUベースでキャッシュアウトされる
  • Warehosue停止時にクリアされる
  • パフォーマンステストでキャッシュを使用したくないときは、WarehouseをSUSPENDする