❄️
Snowflakeの3つのキャッシュ + α
全体像
Metadata Cache
- レイヤー:Cloud Service
- min(), max(), count(*) などメタデータの参照だけで結果が得られる場合に使用
- メタデータの情報のみを利用するためWarehouseは利用しない(課金もされない)
- メタデータのみを利用しているということなのでキャッシュとは言えないのではないかという考え方もあるが、テーブルデータの代表値をメタデータとしてキャッシュしている、と考えることもできる。
Result Cache
- レイヤー:Cloud Service
- 同じSQLを実施した結果を再利用(ホワイトスペースの違いなどは無視して同一視してくれる)
- 他のユーザが同じ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する
番外
Snowsightのワークシート・バージョンに紐づけられて保存されている検索結果
- 既存のSnowsightワークシートを開くと以前の検索結果も表示されるが、これは上述のResult Cacheとは別物
- ワークシートを開くたびにクエリが再実行されている訳ではない
- 24時間以上保存されており、最新のデータを元にした結果ではない
- ワークシートのバージョン履歴を遡れば、その時の結果が「結果」のペインに表示される
- つまり各ワークシート・バージョンの「エディタ」のペインと「結果」のペインがセットで保存されていると考えられる
Discussion