どうも、truestarのk.takahashiです。
Snowflakeには様々なデータの取得を高速かつ効率的に行う方法があるのですが、今回はその中の一つのキャッシュについて仕組、特徴、およびそれらの使用方法について説明します。
キャッシュの仕組み
Snowflakeのキャッシュを理解するには、三層のアーキテクチャを意識すると分かりやすいです。
Snowflakeは三層構造で役割を分離させている、キャッシュを保持している場所も役割に合わせています。
クラウドサービスはメタデータの保持、クエリの最適化、ウェアハウスはデータを抽出しクエリ処理を行う場所と覚えるとキャッシュの理解もしやすいです。
キャッシュの特徴
METADATA CACHE
Snowflake は、テーブルに関する情報をクラウド サービス層のメタデータに保存します。メタデータに格納されるこのテーブル情報は、Snowflake ではメタデータ キャッシュとして利用できます。
特徴
有効期限がなく、どのユーザーでも参照が可能です。
またクエリ処理を挟まないため費用が掛からないかつ効率的に情報を取得できます。
Snowflake側が自動的に判断をするため、意識せず利用することが可能です。
※更新された最新データを取得
保存内容
以下のメタデータを取得できます。
- テーブルの 行数、サイズ、バージョン
- 列の MIN 値と MAX 値、 DISTINCT 値の数、NULLの数
- 物理ファイルの参照
デモンストレーション
試しにメタデータに存在する、列のMIN, MAX, COUNT(*)情報を実行しました。
クエリプロファイルを確認するとMETA – DATA BASED RESULTとだけ記述があり、仮想ウェアハウスは使用されていませんでした。
QUERY RESULT CACHE
クエリ結果はクラウドサービスレイヤーに一定期間保持されます。基礎となるデータまたはベース テーブルの条件が変更されない場合、クエリの再実行をせず結果を再利用することが可能です。
特徴
24時間保存され、クエリ再実行されると最初の実行日時から最大31日まで、結果の24時間の保持期間をリセットします。また利用するには、クエリを最初に実行にしたロール権限と一致する必要があります。
クエリ結果のキャッシュをUSE_CACHED_RESULTセッション パラメータを使用して無効化することも可能です。
あとクエリには、 ユーザー定義関数(UDFs) または 外部関数 が含まれていないなどの細かい制約も存在します。詳しい内容は公式ドキュメントを参照ください。
利用シーン
利用シーンとして以下が想定されます、
- 集計関数や半構造化データ分析など、大量のコンピューティングを必要とするクエリの実行
- 非常に頻繁に実行されるクエリ
- 複雑なクエリ
デモンストレーション
クエリ結果のキャッシュを実際に試してみましょう、まずは同じサンプルで1回目のクエリを実行します。
当然ながら、ウェアハウスは使用されている状態です。
次に2回目を実行してみます。するとQUERY RESULT REUSEという表示がされ、クエリが再使用されたことが分かります。また先ほどに比べて時間も短縮されました。
DATA CACHE
仮想ウェアハウスはテーブルからデータを抽出するたびに、そのデータをローカル(SSD)にキャッシュします。テーブルのデータが変更されておらず、保持されたデータの全部または一部を使用するクエリが同じ仮想ウェアハウスで実行された際に、キャッシュ内のデータを再利用します。
特徴
ウェアハウスが停止されなければキャッシュは存在しますが、ローカルが満杯になると参照されていない時間が最も長いデータ(LRU)から消去されていきます。また、仮想ウェアハウスのキャッシュのサイズは、仮想ウェアハウスのサイズに依存し、仮想ウェアハウスのサイズが大きくなると、キャッシュも大きくなります。
注意点
メタデータキャッシュ、クエリ結果のキャッシュとは異なりウェアハウスの実行が絡むため、料金が発生します。そのため、キャッシュを利用した際とウェアハウスのサイズを変更した際のコストパフォーマンスを比べ最適な選択をする必要があります。
デモンストレーション
データキャッシュがクエリパフォーマンスを向上させるのかみていきます。
検証のため、既存の仮想ウェアハウスのキャッシュをクリアにします
ALTER WAREHOUSE COMPUTE_WH SUSPEND;
ワークシートで、サンプルデータを使用しSQLクエリを実行します。
ウェアハウスを一度止めたので、使用キャッシュは0%となります。
SELECT O_ORDERKEY,O_CUSTKEY,O_ORDERSTATUS,O_ORDERDATE
FROM ORDERS
WHERE O_ORDERDATE < DATE('1996-09-17')
ORDER BY O_CUSTKEY desc
LIMIT 100;
次に少し、条件を変えたクエリを実行してみます。クエリプロファイルの統計情報をみると、データの54.45% がキャッシュからスキャンされました。これで仮想ウェアハウス キャッシュが一部再利用示されることがわかりました。
SELECT O_ORDERKEY,O_CUSTKEY,O_ORDERSTATUS,O_ORDERDATE,O_TOTALPRICE
FROM ORDERS
WHERE O_ORDERDATE < DATE('1997-09-17')
ORDER BY O_CUSTKEY desc
LIMIT 100;
さいごに
Snowflakeの特徴を活かし、スピードと低コストを実現させたいですね。
これからも、特徴的な機能を紹介していきますのでよろしくお願いいたします!
では。
(参考文献)
https://thinketl.com/caching-in-snowflake/
https://docs.snowflake.com/ja/user-guide/querying-persisted-results