見出し画像

Snowflakeさわってみた。Dynamic Table試してみた。

分析屋の下滝です。

Snowflakeをさわってみよう、の12回目です。

今回は、6月にプレビューになったダイナミックテーブル(Dynamic Table)を試してみます。

ダイナミックテーブルとは

詳しくは、以下の公式ドキュメントを参考にしてください。

以下、ダイナミックテーブルの概要を公式から引用します。

ダイナミックテーブルは宣言型データ変換パイプラインの構成要素です。Snowflakeのデータエンジニアリングを大幅に簡素化し、信頼性、コスト効率、自動化されたデータ変換方法を提供します。データ変換ステップを一連のタスクとして定義し、依存関係とスケジューリングを監視する代わりに、ダイナミックテーブルを使用して変換の最終状態を定義するだけで、複雑なパイプライン管理をSnowflakeに任せることができます。

ダイナミックテーブルは、指定したクエリの結果を実体化(マテリアライズ)するテーブルです。ターゲットテーブルを別に作成し、そのテーブルのデータを変換および更新するコードを記述するのではなく、ターゲットテーブルをダイナミックテーブルとして定義し、変換を実行する SQL 文を指定することができます。自動化されたプロセスにより、マテリアライズされた結果が定期的な(多くの場合はインクリメンタルな)更新によって自動的に更新されます。

https://docs.snowflake.com/en/user-guide/dynamic-tables-about

本記事では、細かい背景は気にせず、とりあえずどういう機能なのか使ってみます。

以下のようなProductテーブル(ベーステーブル)があるとします。

このテーブルに対するダイナミックテーブルを定義してみます。CREATE DYNAMIC TABLEを使います。

CREATE OR REPLACE DYNAMIC TABLE product_dynamic
 TARGET_LAG = '1 minutes'
  WAREHOUSE = "テストウェアハウス"
  AS
    SELECT id, name FROM product where price >= 2000;

TARGET_LAGは「ダイナミックテーブルの内容がベーステーブルの更新に遅れる最大時間を指定する。」を意味します。例では最小時間の1分を指定しています。

WAREHOUSEは、ダイナミックテーブルがリフレッシュされる際に使われるウェアハウスを指定します。

ASでは、ダイナミックテーブルの結果となるクエリを指定します。ここでは、productテーブルからpriceが2000以上のものを抽出しています。

ダイナミックテーブルに対するクエリを試します。

select * from product_dynamic;

結果は以下となり、意図した結果となっています。

では、次に、productに以下の行を追加したときに、product_dynamicの結果も更新されているのか確認します。

insert into product VALUES(3, 'ccc', 3000);

Productテーブルの中身は以下になります。

product_dynamicの結果は以下となりました。先程追加したレコードが表示されており、意図した結果となっています。

基本的な使い方は以上となります。

補足として、あるダイナミックテーブルが他のダイナミックテーブルをベースとして使うこともできるそうです。詳しくは公式ドキュメントを参照してください。

マテリアライズドビューとの違い

他に気になる点としては、マテリアライズドビューとの違いです。公式ドキュメントでは、比較として次のように説明がされています。引用します。

===================
【違いその1】
マテリアライズドビュー
マテリアライズドビューは、クエリのパフォーマンスを透過的に向上させるように設計されています。

例えば、ベーステーブルをクエリする場合、Snowflakeのクエリオプティマイザは、代わりにマテリアライズドビューをクエリするようにクエリを自動的に書き換えることができます。

ダイナミックテーブル
ダイナミックテーブルは、データパイプラインでストリーミングデータを変換するために設計されています。

ダイナミックテーブルはクエリのパフォーマンスを向上させますが、Snowflakeのクエリオプティマイザはダイナミックテーブルを使用するように自動的にクエリを書き換えることはありません。クエリでダイナミックテーブルを指定した場合のみ、クエリでダイナミックテーブルが使用されます。

【違いその2】
マテリアライズドビュー
マテリアライズドビューは単一のベーステーブルしか使用できません。マテリアライズドビューは、複雑なクエリ (結合や入れ子のビューを含むクエリなど) に基づくことはできません。

ダイナミックテーブル
ダイナミックテーブルは、結合や結合を含む複雑なクエリに基づくことができる。

【違いその3】
マテリアライズドビュー
マテリアライズドビューを通してアクセスされるデータは常に最新です。DML 操作によってベーステーブルのデータが変更された場合、Snowflake はマテリアライズドビューを更新するか、ベーステーブルから更新されたデータを使用します。

ダイナミックテーブル
データは、ダイナミックテーブルのターゲットラグタイムまでのものです。
===================

一番の使い道の違いは、二点目の「マテリアライズドビューは単一のベーステーブルしか使用できません。」というマテリアライズドビューの制約の点かもしれません。

どんなときにダイナミックテーブルを使うのか

最後に、では、どんなときにダイナミックテーブルを使うのか、ということに関しても公式ドキュメントで解説がされているので、翻訳して引用します。

パイプラインのデータを変換するために使用できる方法はいくつかあります(例:ストリームやタスク、CTAS、独自のカスタムソリューションなど)。 ダイナミックテーブルはデータを変換する方法の1つです。

ダイナミックテーブルは、以下のような場合に最適です:
・データの依存関係を追跡し、データの更新を管理するために独自のコードを書きたくない。
・ストリームやタスクの複雑さを避けたい。
・リフレッシュのスケジュールを細かく制御する必要がない。
・複数のベーステーブルに対するクエリの結果を実体化(マテリアライズ)する必要がある。
・ダイナミックテーブルで現在サポートされていない問い合わせ構造 (ストアドプロシージャ、『ダイナミック・テーブルでサポートされる非決定性関数』にリストされていない非決定性関数、外部関数、UDFなど) を使用する必要がない。

https://docs.snowflake.com/en/user-guide/dynamic-tables-about#when-to-use-dynamic-tables

今回は以上です。

株式会社分析屋について

ホームページはこちら。

noteでの会社紹介記事はこちら。

【データ分析で日本を豊かに】
分析屋はシステム分野・ライフサイエンス分野・マーケティング分野の知見を生かし、多種多様な分野の企業様のデータ分析のご支援をさせていただいております。 「あなたの問題解決をする」をモットーに、お客様の抱える課題にあわせた解析・分析手法を用いて、問題解決へのお手伝いをいたします!
【マーケティング】
マーケティング戦略上の目的に向けて、各種のデータ統合及び加工ならびにPDCAサイクル運用全般を支援や高度なデータ分析技術により複雑な課題解決に向けての分析サービスを提供いたします。
【システム】
アプリケーション開発やデータベース構築、WEBサイト構築、運用保守業務などお客様の問題やご要望に沿ってご支援いたします。
【ライフサイエンス】
機械学習や各種アルゴリズムなどの解析アルゴリズム開発サービスを提供いたします。過去には医療系のバイタルデータを扱った解析が主でしたが、今後はそれらで培った経験・技術を工業など他の分野の企業様の問題解決にも役立てていく方針です。
【SES】
SESサービスも行っております。