Snowflakeキャッシュ完全解説【Snowflake解説】

snowflakeのキャッシング

snowflakeの三つのレイヤーのうち、クラウドサービスとコンピュートのレイヤーでキャッシュが動作する。

  • クラウドサービスでは、「メタデータキャッシュ」「クエリレザルトキャッシュ」の二つが

  • コンピュートレイヤーでは、「ローカルディスクキャッシュ」が

これらのキャッシュが連携することでsnowflakeは高速に働く

from https://beyondjapan.com/blog/2020/09/snowflake/

各レイヤーの情報は上図の通り。

流れとしては

  1. クエリリザルトキャッシュ内部に結果があるか確認し、データが変更されていないかを確認する
  2. メタデータキャッシュに結果がないかを確認する。
  3. ローカルディスクキャッシュに結果がないかを確認する。
  4. 上記にデータがなければ実行

メタデータキャッシュ

クエリ処理中に高速にアクセスするために利用するメタデータ

  • データベースの高速化に貢献されている

  • パーテションの列レベルのメタデータ

    • 最小値
    • 個別値の数
    • NULLの数
    • SHOWコマンド
    • MIN,MAX,COUNT関数
  • 仮想ウェアハウスを利用する必要がない。(ただしクラウドサービスの料金がまれに適用されます)

メタデータキャッシュの有効性を確認するSQL

1.クエリリザルトキャッシュを使用しないように、USE_CACHED_RESULTを無効にします。

ALTER SESSION USE_CACHED_RESULT = FALSE

2.次のクエリを実行すると、キャッシュを使用しているため一瞬で結果が表示されます。

SELECT MIN(l_orderkey), MAX(l_orderkey) , COUNT(*) from lineitem

3.結果ペインにあるクエリIDをクリックすることで、プロファイルを開けます。

4.プロファイルタブを確認すると、結果はメタデータキャッシュに100%由来していることがわかります

クエリレザルトキャッシュ

同一のクエリが実行された場合かつ、ベースのテーブルが変更されていない場合に、クエリ結果を再利用してくれる。 仮想ウェアハウスのコンピュートを必要とせずに、再利用できるようにキャッシュされた結果をそのまま返す。

  • 他のユーザーがキャッシを利用可能な場合もある
    • SHOW : 同じロールの全てのユーザー
    • SELECT : クエリ内の全てのテーブルに対するSELEÇT権限を持つ全てのユーザー
  • これらのユーザーのみがおなじクエリの結果を再利用できる。

  • 結果セットは、24時間キャッシュされ、一致するクエリが再利用されるたびにカウントされる。また、最大で31日間クエリのキャッシュが有効になる。

  • 結果の再利用は、アカウント/ユーザー/セッションレベルで有効無効をコントロールできる。USE_CACHE_RESULTパラメーターで制御可能

  • 結果セットのキャッシュを使用するためには条件がある

    • 全く同じクエリ(空白を除く)
    • 結果が決定的で、ランダム関数がないこと
    • キャッシュ利用権限があること
  • コンピュートレイヤ、ストレージレイヤを利用していない

  • WEBUIからのSQLでキャッシュを利用した後は、ProfileにQUERY_RESULT_REUSEのフラグが表示される

  • from https://dev.classmethod.jp/articles/snowflake-cache-three/

  • 完全に同一のクエリでなくとも、キャッシュを利用してくれることもある

select * from A

このクエリを実行した後、where句を利用する場合、例えば

select * from A where id="1234"

を実行するときは、元のクエリが再利用される。

クエリレザルとキャッシュを確認するクエリ

  1. 以下のクエリを実行します
select * from lineitem
  1. 上のクエリとにている次のクエリを実行します
select
    *
from (select * from lineitem) A
where
    A.id = '1234'
  1. この状態でクエリIDからプロフィールを確認すると、キャッシュを再利用していることが確認できます。

ローカルディスクキャッシュ

仮想ウェアハウスのSSD内部に、キャッシュされたデータのこと。

  • 例えば、SELECT network FROM rating WHERE (data_stream = live)を実行した場合。

  • ローカルディスクには

    • data_stream = 'Live'
    • network
  • がキャッシュとして格納される。

仮想ウェアハウスは、最初にローカルで利用なデータを読み取り、次にリモートクラウドストレージから残りを読み取る

  • ローカルディスクキャッシュは、Profileから確認できる

  • この場合は、データの100%をローカルキャッシュから取れた。

  • from https://dev.classmethod.jp/articles/snowflake-cache-three/

  • キャッシュの有効期限は、ウェアハウスが存在する間なので、キャッシュを優先す流場合はウェアハウスは止めないようにすること

備考

title:snowflakeのキャッシュサービス一覧【snowflake解説】

img:https://static.thenounproject.com/png/1716494-200.png

category_script:page_name.startswith("7")