🦁

Snowflake クエリ結果キャッシュについて

2022/11/06に公開

Snowflakeにはいくつかキャッシュがありますが、今回はその中のクエリ結果キャッシュについて動作を見ていきます。
キャッシュを使うとどのくらい早く結果が返ってくるのか見ていきましょう!

ドキュメントより抜粋
クエリが実行されると、結果は一定期間保持(つまり、キャッシュ)されます。
期間が終了すると、結果はシステムからパージされます。

Snowflakeは永続的なクエリ結果を使用して、何も変更されていない場合(「取得の最適化」)に
結果が再生成されるのを防ぎます。
さらに、永続的なクエリ結果を使用して結果を後処理できます
(例:既に計算された結果の上に新しいクエリを重ねる)。

すべてのサイズの永続的なクエリ結果の場合、キャッシュは24時間後に期限切れになります。

大規模な保存済みのクエリ結果(つまり、サイズが100 KB以上)にアクセスするために
使用するセキュリティトークンは、6時間後に期限切れになります。
結果がまだキャッシュにある間に、結果にアクセスするための新しいトークンを取得できます。
より小さい保存済みのクエリ結果は、アクセストークンを使用しません。

クエリ結果キャッシュの動作検証

データの準備

今回はSnowflakeに元々用意されているSNOWFLAKE_SAMPLE_DATA.TPCDS_SF100TCL.CUSTOMERデータを利用していきます。
データサイズは5.2GB、行数は100,000,000です。

キャッシュ無し実行時速度

SELECT AVG(C_BIRTH_YEAR) FROM SNOWFLAKE_SAMPLE_DATA.TPCDS_SF100TCL.CUSTOMER;

結果
4.81秒でした。

さらに詳細なクエリ内容を見てみる

キャッシュ有り実行速度

再度同じSQLを実行する

SELECT AVG(C_BIRTH_YEAR) FROM SNOWFLAKE_SAMPLE_DATA.TPCDS_SF100TCL.CUSTOMER;

結果
150ミリ秒でした。
キャッシュ無しと比較して早く結果が返ってきているのが分かります。

さらにクエリプロファイルを確認すると、QUERY RESULT REUSEのみとなっています。
これは前回実行時のクエリ結果のキャッシュを再利用したことを示しています。

ちなみにですが、別ユーザで同じSQLを実行してもクエリ結果キャッシュを利用できます。

Discussion