Snowflakeの消費クレジットはキャッシュによって抑えられるのか検証してみた

2024年3月23日検証してみた

Snowflakeはクエリ処理や保持するデータ量、データ転送等でコスト(クレジット消費)が発生します。
WebFOCUSでは基本的にSnowflakeをデータアダプタとして使用する性質上、クエリ処理でのコストを考慮する必要があります

一方、Snowflakeにはキャッシュという機能もあり、中にはコンピュート無しで結果セットを再利用できるようにキャッシュされる「クエリ結果キャッシュ」というものが存在します。これを利用する場合には毎回クエリ処理を発生させる必要がありません。
これは即ち、コストが発生しないことを示します。

そこで今回は、WebFOCUSの通常運用を想定した場合にコストが抑えられるのかどうかを検証してみました。

Snowflakeは、クラウドベースのデータウェアハウスサービスであり、企業が大量のデータを効率的かつ安全に管理・分析できるように設計されています。
また、Snowflakeは、Amazon Web Services(AWS)、Microsoft Azure、Google Cloud Platform(GCP)などの主要なクラウドプロバイダー上で動作します。

単なるデータウェアハウスの機能に留まらず、データレイク・データエンジニアリング・データサイエンス・データシェアリング・アプリケーションなど単一プラットフォームでデータ統合からデータ活用を実現できるデータプラットフォームです。
また、拡張し続けるエコシステムにより様々な他社ツールを親和性高く利用できるのも特徴です。

WebFOCUSとの接続方法はこちらの記事をご参照ください。
https://fobi.ashisuto.co.jp/tech/technical/verification/snowflake-adapter/

検証の前提

  • WebFOCUSバージョン
    • 9.2.1(検証時の最新バージョン)
  • データアダプタ
    • 「Snowflake(構成JDBC)」を使用します。
  • レポート
    • 上記データアダプタを使用してたレポート(.fex)を1つ作成します。
  • 検証内容
    • 1つのレポートに対し同時に100ユーザーがアクセスした場合の動作を想定した操作を行います。
    • クエリ結果キャッシュの影響を確認する為に、この操作を2回行います。
  • 検証に使用するツール
    • JMeter
      ※オープンソースの負荷検証ツールです。

クエリ結果キャッシュが無い事を確認

クエリ結果キャッシュは、あるクエリが参照するテーブルのデータが変更された場合、または同じクエリが24時間以内に発行されない場合には無効となります。
無効となった場合にはクエリ結果キャッシュは新たに作成される必要がありますが、この為にはコンピュートが動作するのでコストが発生します。

JMeterでテスト計画を実施

HTTPリクエストの送信先はSnowflakeのデータアダプタを使用して作成したレポートに設定します。
想定は100ユーザーなので、[スレッド数]を100に設定したスレッドグループを作成します。

実施結果:QUERY_HISTORY ビュー

まずはSnowflakeの「QUERY_HISTORY ビュー」でクエリ結果キャッシュの使用有無を確認しました。

その結果、1回目の実行では最初の1クエリだけがクエリ結果キャッシュ未使用で、後の99クエリは全てクエリ結果キャッシュを使用している状況でした。

※以下、行列を抜粋して掲載します。
※WAREHOUSE_SIZEやCLUSTER_NUMBERに値がある行がクエリ結果キャッシュ未使用のクエリです。

また、2回目の実行では100クエリが全てクエリ結果キャッシュを使用している結果となりました。

実施結果:WAREHOUSE_METERING_HISTORY ビュー

次にSnowflakeの「WAREHOUSE_METERING_HISTORY ビュー」でクレジットを確認しました。
その結果、完全にクエリ結果キャッシュの使用率が100%である2回目ではクレジットが1/3程度に抑えられていることが分かります。

※1
時間内にウェアハウスに使用されたクレジットの総数です。
これは CREDITS_USED_COMPUTE と CREDITS_USED_CLOUD_SERVICES の合計です。

※2
時間内にウェアハウスに使用されたクレジットの数です。

※3
時間内にクラウドサービスに使用されたクレジットの数です。

まとめ

WebFOCUSで作成したレポートに対して同時に複数のアクセスがあった場合でも、内部的に実行されるクエリが同じ場合にはSnowflakeのクエリ結果キャッシュの機能により、以下の動作となる事が確認できました。

  • コストが抑えられる。
    • 同じ情報を複数人が参照するような場合には、より効果が高い。
  • クエリの実行自体のパフォーマンスが向上する。