Snowflake動的テーブル入門|自動更新されるテーブルの仕組み

Snowflake動的テーブル入門|自動更新されるテーブルの仕組み Snowflake

はじめに:動的テーブルって何がうれしいの?

「元のテーブルが更新されたら、集計結果のテーブルも自動で更新してほしい…」
そんなとき、これまでは タスク + ストアドプロシージャマテリアライズドビュー を組み合わせて、自分でパイプラインを作る必要がありました。

でもSnowflakeの動的テーブル(Dynamic Table)を使えば、SELECT文を1本書くだけで「自動更新されるテーブル」が出来上がります!今回はそんな便利機能の仕組みと使い方を、初心者向けにやさしく解説していきますね。

Snowflake動的テーブルがSELECT文1本で自動更新パイプラインを実現する仕組みを示す概念図

動的テーブルの基本概念

「結果を保存する宣言型のテーブル」

動的テーブルは、ひと言で言うと「クエリの結果を保存しておくテーブル」です。普通のテーブルと違うのは、中身を自分でINSERTしないこと。代わりに AS SELECT ... でクエリを定義しておくと、Snowflakeがその結果を自動で計算&保存してくれます。

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

  • ビュー:クエリのたびに毎回計算する(結果は保存されない)
  • マテリアライズドビュー:結果が保存されるが、使えるクエリ構文に制限が多い(JOIN不可など)
  • 動的テーブル:結果が保存され、JOINや集計、ウィンドウ関数も自由に使える。指定した間隔で自動更新

ビューとマテリアライズドビューの違いについては Snowflakeビューとマテリアライズドビューの違い|初心者向け使い分けガイド で詳しく解説しているので、合わせて読んでみてください。

使い方:CREATE DYNAMIC TABLE

基本構文はシンプルです。TARGET_LAG(どれくらい新鮮なデータを保つか)と WAREHOUSE(計算に使うウェアハウス)を指定するのがポイント。

CREATE OR REPLACE DYNAMIC TABLE daily_sales_summary
  TARGET_LAG = '5 minutes'
  WAREHOUSE = my_wh
  AS
SELECT
  order_date,
  COUNT(*)         AS order_count,
  SUM(amount)      AS total_amount
FROM orders
GROUP BY order_date;

これだけで「orders テーブルが更新されてから最大5分以内に、daily_sales_summary も最新化される」というパイプラインが完成します。タスクもストアドも不要です。

CREATE DYNAMIC TABLE構文でTARGET_LAGとWAREHOUSEを指定するSnowflake動的テーブル定義のコード例

TARGET_LAGの指定方法

TARGET_LAG は「データの鮮度の上限」を表すパラメータです。

  • TARGET_LAG = '1 minute' … 最大1分の遅れまで許容(頻繁に更新)
  • TARGET_LAG = '1 hour' … 最大1時間の遅れ(コスト節約寄り)
  • TARGET_LAG = DOWNSTREAM … 下流の動的テーブルが必要なときだけ更新

Snowsightでの操作

Snowsight左メニューの Data → 対象スキーマを開くと、Dynamic Tables という項目があります。ここから定義の確認や、リフレッシュ履歴・所要時間のグラフを確認できます。失敗していないかをサクッとチェックできるので便利です。

よくあるユースケース

  • ELTパイプラインの中間テーブル:生データ → クレンジング → 集計、と段階的な変換を動的テーブルのチェーンで実現
  • BIダッシュボード用の集計テーブル:重い集計を事前計算して、ダッシュボードのレスポンスを高速化
  • Snowpipeと組み合わせたニアリアルタイム分析:ファイル取り込み→集計まで自動化

注意点

  • 更新にはウェアハウスのクレジットを消費します。TARGET_LAG を短くしすぎないように。
  • クエリには使えない関数や構文の制約があります(非決定的な関数など)。
  • 初回作成時は全件を計算するため、データ量が多いと時間がかかります。

まとめ

動的テーブルを使えば、SELECT文を書くだけで自動更新されるテーブルが手に入ります。タスクやプロシージャを書かなくてもパイプラインが組めるので、データエンジニアリングの工数を大きく削減できる強力な機能です。ビューやマテビューと使い分けながら、ぜひ活用してみてくださいね!

参考リンク

関連記事