1.Snowflakeのクエリキャッシュについての動きを理解する
Snowflakeは、取得したクエリに対して、まずクエリキャッシュを探しに行きます。
引用:
https://www.linkedin.com/pulse/query-lifecycle-snowflake-minzhen-yang-7mbfc/
ディスクのデータ読み込みの流れ
ローカルディスク(キャッシュ)を確認
Snowflakeの仮想ウェアハウス(コンピュートリソース)が使用するキャッシュにデータがあれば、それを利用。
キャッシュには、最近クエリで使用されたデータのコピーが含まれる。
これにより、頻繁にアクセスされるデータの取得を高速化。
キャッシュにデータがなければ、リモートストレージ(クラウドストレージ)を確認
Snowflakeは、ストレージ層にデータを保存している(AWS S3、Google Cloud Storage、Azure Blob Storage)。
ローカルキャッシュにデータがない場合、ここからデータを取得し、必要に応じてキャッシュに保存。
2.クエリキャッシュの種類
Snowflakeには、いくつかのクエリキャッシュ機能が存在します。
クエリリザルトキャッシュ
クエリリザルトキャッシュについては、以下のように確認することができます。
select
*
from
transactions m
left outer join
customer_data d1
on
m.customer_id = d1.customer_id;
このように、2つのテーブルスキャンと、ジョインの処理が実際にメモリ上で走っていることがわかります。
また同じように、同一クエリを走らせてみると以下のように、クエリキャッシュが効いていることがわかります。
ウェアハウスキャッシュ
では、このクエリキャッシュが効いた状態で、その中の単一のカラムのみを取得した場合どうなるでしょうか
select
PRICE
from
transactions m
left outer join
customer_data d1
on
m.customer_id = d1.customer_id;
結果は以下のとおりです。ディスクの読み込みがありません。全てメモリ内で完結しています。
これは、ウェアハウスキャッシュが効いている証拠です。
メモリ内にデータを保持しているため、わざわざディスクを読み込まずに高速にクエリを返してくれます。
ウェアハウスが停止すると、このキャッシュは無くなります。
メタデータキャッシュ
メタデータキャッシュは、Snowflake側が管理しているデータベースに
各種テーブルの統計情報を管理しており、そこからデータを取得する際に働くキャッシュになります。
例えば、よくアンチパターンになる以下のクエリを走らせてみたらどうでしょうか。
SELECT count(*)
from table
この通り、メタデータキャッシュが効き、ウェアハウスのスキャン量がありません。
最大値や最小値においてもこのメタデータキャッシュが聞くことができ、
有効に使えます。
3.参考資料
4.tips
実際にクエリを確かめたい場合は、リザルトキャッシュをFALSEに設定しましょう
この際、セッション単位でFALSEにすることをおすすめします。
アカウント単位で実行すると、そのままキャッシュが効かなくなり、もったいないです。
-- キャッシュを無効化にさせたい場合
ALTER SESSION SET USE_CACHED_RESULT = FALSE;
-- 再度キャッシュを効かせたい場合
ALTER SESSION SET USE_CACHED_RESULT = true;
-- 実際にキャッシュがどうなっているか確認する方法
SHOW PARAMETERS LIKE '%USE_CACHED_RESULT%';