In Silico

データ基盤

Snowflake Dynamic Tablesとは?SELECTだけで結果の表を最新に保つ

2026/10/29 (更新: 2026/11/3) シリーズ「Snowflake 入門」 第9回 / 全13回

シリーズSnowflake 入門全13回
  1. 第1回Snowflakeとは?仕組み・料金・使い方をわかりやすく解説
  2. 第2回Snowflakeのウェアハウスとは?サイズとクレジット・自動停止
  3. 第3回Snowflakeの料金の仕組みとは?計算・保存・転送とコスト管理
  4. 第4回Snowflake マイクロパーティションとは?プルーニングとクラスタリング
  5. 第5回Snowflake VARIANTとは?JSONを扱う半構造化データの仕組み
  6. 第6回Snowflake Time Travel(タイムトラベル)とは?保持期間と復元
  7. 第7回Snowflake レプリケーションとは?別リージョンに複製して切り替える
  8. 第8回Snowflake ロールとは?権限をロールに与えて階層で渡す仕組み
  9. 第9回Snowflake Dynamic Tablesとは?SELECTだけで結果の表を最新に保つ
  10. 第10回Snowflake データ共有とは?コピーせずに取引先と同じ表を使う
  11. 第11回Snowflake Icebergテーブルとは?同じデータを他のエンジンでも読む
  12. 第12回Snowflake Cortexとは?データを外に出さずにSQLでAIを使う
  13. 第13回Snowflake Well-Architectedとは?5つの柱で自分の判断を見直す

このシリーズの紹介へシリーズ一覧へ

  • Dynamic Tables
  • Snowflake
  • ターゲットラグ
  • TARGET_LAG
  • Streams
  • Tasks
  • COPY INTO
  • Snowpipe
  • 増分リフレッシュ
  • ステージ
  • Snowpipe Streaming
  • パイプライン
  • REFRESH_MODE
  • マテリアライズドビュー
  • dbt
  • Openflow
  • タスクグラフ
  • データ基盤
目次
背景・問い・要点
背景

データ基盤では、取り込んだ生のデータを、そのまま使うことは少ない。不要な行を除き、別の表と結合し、日ごとに集計した表を作る。この変換を、データが入るたびに回し続ける仕組みを、パイプラインという。

ふつうは、変わった行を追いかけ、MERGE で結果の表を更新する処理を書き、それを決まった時刻に動かす。Snowflake では、この変換を SELECT 一つで書き、更新を Snowflake に任せる表を Dynamic Tables という1。

問い

Snowflake の Dynamic Tables とは何で、取り込んだデータの変換を、誰がどう回し続けるのか。

要点

Dynamic Tables は、SELECT の結果を表として持ち、利用者が決めたターゲットラグ(データがどれだけ古くてよいかの目標)を超えないよう、Snowflake が自動で更新し続ける表である。利用者は、結合や集計を重ねた変換も、SELECT だけで回せる。

利用者は、元の表の行が足されても、書き換わっても、消されても、結果をそのとおりに保つ処理を書かなくてよい。表の変更を記録する Streams と、決まった間隔で処理を動かす Tasks を利用者が組み合わせる方法では、その処理を MERGE で書き分ける23。Snowflake は、結合や集計を含む新しいパイプラインには Dynamic Tables を勧めている。

モデル・例示

注文が後から変わったとき、売上の表はどうなるか

Dynamic Tables の便利さは、元の表がどう変わっても、結果の表を定義どおりに保つ処理を、利用者が書かなくてよいことにある。注文が後から返品に変わった場面で、Streams と Tasks と比べる。注文のデータは、Snowflake の Dynamic Tables の作り方のページにある例を使う4。

注文の表 raw_orders に、次の 5 件が入っているとする。顧客の表 dim_customers には、顧客ごとの地域と区分が入っていて、顧客 1 は US-West の Enterprise、顧客 2 は US-East の Mid-Market、顧客 3 は EU-West の Startup である4。

注文   顧客  日付        数量  単価    状態
1001   1     2025-01-15  3     29.99   completed
1002   2     2025-01-15  1     49.99   completed
1003   1     2025-01-15  2     29.99   pending
1004   3     2025-01-16  5     12.50   completed
1005   2     2025-01-16  1     49.99   returned

作りたいのは、返品を除いて、日と、顧客の地域と区分ごとに、注文の数と売上(数量×単価の合計)を集めた売上の表である。今の注文からは、次の 3 行になる4。

日付        地域     区分        注文の数  売上
2025-01-15  US-East  Mid-Market  1         49.99
2025-01-15  US-West  Enterprise  2         149.95
2025-01-16  EU-West  Startup     1         62.50

1 月 15 日の US-West は、顧客 1 の注文 1001 と 1003 で、3×29.99+2×29.99=149.953 \times 29.99 + 2 \times 29.99 = 149.95 になる。返品の 1005 は数えない。

Dynamic Tables で書くもの: 売上の表を Dynamic Tables(名前は daily_sales)として作り、その中身を SELECT で書く。データがどれだけ古くてよいかの目標(ターゲットラグ)は 30 分、更新に使うウェアハウス(問い合わせを動かす計算の単位)は transform_wh とする1。公式の例はこの変換を二つの Dynamic Tables に分けて書いているが、ここでは一つの SELECT にまとめた。更新の方法は、その例と同じく、変わった分だけを計算する INCREMENTAL を REFRESH_MODE で明示する4。

CREATE OR ALTER DYNAMIC TABLE daily_sales
    TARGET_LAG = '30 minutes'
    WAREHOUSE = transform_wh
    REFRESH_MODE = INCREMENTAL
AS
    SELECT o.order_date::DATE AS order_day,
           c.region, c.segment,
           COUNT(*) AS order_count,
           SUM(o.quantity * o.unit_price) AS daily_revenue
    FROM raw_orders o
    JOIN dim_customers c ON o.customer_id = c.customer_id
    WHERE o.order_status != 'returned'
    GROUP BY ALL;

注文 1003 が返品に変わる: たとえば、保留中だった注文 1003 が、後から returned に変わったとする(ここからは、定義から考えた例である)。売上の表の 1 月 15 日の US-West は、注文の数が 2 から 1 に、売上が 149.95 から 89.97 に変わるべきである。

Streams と Tasks で保っていると、次のように動く。ストリームは、行の書き換えを、古い行を消す記録と新しい行を足す記録の組として返す2。

  1. 注文の表ストリーム1. 1003 が pending から returned に書き換わったと記録する
  2. タスクストリーム2. 前に読んだところから後の変更はあるか
  3. ストリームタスク3. 1003 の古い行(消す)と新しい行(足す)を返す
  4. タスク売上の表4. 利用者が書いた MERGE で、1 月 15 日の US-West から 1 件と 59.98 を引く

図の 4 の「引く」処理は、利用者が MERGE に書いておく必要がある。注文が足されたときに足す処理しか書いていなければ、売上の表は 2 件・149.95 のままで、注文の表と合わなくなる。返品のほかに、数量や単価の修正、注文の取り消しにも、それぞれ処理を書く。

Dynamic Tables で保っていると、次のように動く。

  1. Snowflake1. ターゲットラグの 30 分を超えないうちに、確かめに行く
  2. Snowflake注文の表2. 前の更新から変わった注文はあるか
  3. 注文の表Snowflake3. 1003 が returned に変わった
  4. Snowflake4. 変わった 1003 の分だけ計算し直し、返品なので数えない
  5. Snowflake売上の表5. 1 月 15 日の US-West を 1 件・89.97 にする

利用者が書いたのは、最初の一文(SELECT と、ターゲットラグ、ウェアハウス、更新の方法)だけである。SELECT に「返品を除く」と書いてあるので、注文が後から返品に変わっても、売上の表はそのとおりになる。いつ確かめるかは、ターゲットラグの 30 分を超えないよう Snowflake が決める5。更新の方法に INCREMENTAL を指定してあるので、Snowflake は 5 件の注文をすべて数え直すのではなく、変わった 1003 の分だけを計算して売上の表に反映する。これを増分リフレッシュという6。

まとめると、Dynamic Tables では、次の三つを書かなくてよくなる7。

  • 元の表の変更を記録するストリーム
  • 決まった間隔で処理を動かすタスク
  • 足す・引く・書き換えるの場合を書き分ける MERGE

Snowflake は、Streams と Tasks で作るストリーム、売上の表のような結果の表、タスクと MERGE の処理を、Dynamic Tables なら SELECT 一つの定義で置き換えられるとしている。元の注文の表は、どちらでも作る7。

Dynamic Tables とは:SELECT とターゲットラグ

Dynamic Tables は、SELECT の結果を表として持ち、最新に保つ。利用者は SELECT とターゲットラグを決め、Snowflake が依存関係を把握して更新する1。

ターゲットラグ: ターゲットラグは、更新の間隔ではなく、データがどれだけ古くてよいかの目標である。10 分なら「10 分ごとに更新する」ではなく、「データが 10 分より古くならないようにする」という意味である5。

Snowflake の技術者らは、2025 年の論文で、この考え方を説明している。ビューは、読むたびに SELECT を動かして結果を返す。Dynamic Tables の中身は、そのビューを過去のある時点で読んだ結果と同じになる。その時点と今との差が遅れである8。論文によれば、多くの実用の場面は数秒から数十分の遅れで足り、Dynamic Tables は数秒から数時間の処理の遅れを想定して作られている8。ただし、今のドキュメントでは、ターゲットラグの最短は 60 秒である5。

更新の方法:変わった分だけか、全部か

Dynamic Tables の更新(リフレッシュ)には、増分とフルの二つのやり方がある。後で述べる AUTO と ADAPTIVE は、どちらで動かすかを Snowflake に選ばせる指定である6。

REFRESH_MODE を書かないと AUTO になり、作るときに Snowflake が増分か全部かを選ぶ4。2026 年 7 月には、増分を基本にしつつ、変わった量が多いときは作り直す ADAPTIVE が一般提供になった。Snowflake は、増分で回す処理には ADAPTIVE を勧め、本番では AUTO に任せずに方法を明示するよう書いている96。AUTO が ADAPTIVE を選ぶことはない6。

増分リフレッシュに向かない書き方もある。EXCEPT や INTERSECT、FROM の外の副問い合わせ(WHERE EXISTS など)を含むと、増分では作れない10。INCREMENTAL を指定していれば作成が失敗し、AUTO なら全部の更新になる10。どちらになったかは、SHOW DYNAMIC TABLES の refresh_mode と refresh_mode_reason で確かめる4。作った後に ALTER で方法を変えることはできず、変えるには CREATE OR ALTER か CREATE OR REPLACE で作り直す6。

費用:更新のウェアハウスと、変更の確かめ

Dynamic Tables には、更新を動かすウェアハウスが要る11。費用は次のように出る12。

更新の記録は、関数 DYNAMIC_TABLE_REFRESH_HISTORY で 7 日分を見られる13。元の表に変化が無かった更新は NO_DATA と記録される14。

Streams と Tasks、マテリアライズドビューとの使い分け

Dynamic Tables より前から、Snowflake には変換を回す仕組みとして Streams と Tasks がある。

Snowflake の使い分けの指針は、次のとおりである7。

Dynamic Tables には、次の制限がある7。

ただし、更新の方法を CUSTOM_INCREMENTAL にすると、更新の処理を MERGE か INSERT で書ける6。Snowflake は、一文の MERGE か INSERT で書いた Streams と Tasks の処理は、SELECT に書き直さずにこの方法へそのまま移せるとしている15。

Dynamic Tables は読み取り専用で、INSERT や DELETE はできない7。例外として、2026 年 7 月に、定義で更新の対象から外すと決めた範囲(凍結された範囲)の行に限って、INSERT、UPDATE、MERGE、DELETE ができる機能が一般提供になった16。

Streams の動き: ストリームのオフセットは、SELECT で読むだけでは進まず、INSERT のような DML(Data Manipulation Language)の文の中で読むと進む2。METADATA$ACTION の列が INSERT か DELETE かを示し、更新は DELETE と INSERT の組として、METADATA$ISUPDATE を TRUE にして表す2。オフセットが元の表のデータ保持期間の外に出ると、ストリームは古くなって使えず、作り直す2。保持期間が 14 日より短い表では、読まれていないストリームのために、既定で最大 14 日まで保持期間が延び、その分の保存の料金がかかる2。

Tasks の動き: タスクは止まった状態で作られ、ALTER TASK … RESUME で動き出す3。Snowflake が計算資源を用意するサーバーレスと、自分のウェアハウスを使う方式を選べる3。複数のタスクは、起点となるルートタスクと子タスクからなるタスクグラフでつなげる17。ストリームに変更が来たときだけ動くタスクも作れる18。

変換の前:データを取り込む

変換の元になるデータは、まず Snowflake の表に入れる。Snowflake は、クラウドストレージにあるデータファイルを置く場所を、ステージという19。

COPY INTO も Snowpipe も、読み込みながら結合や集計はできない。生のデータを表に入れてから、Dynamic Tables か Streams と Tasks で変換する20。

COPY INTO: ステージのファイルを表に読み込む命令である。まとめて読み込むとき(一括ロード)は、利用者が用意したウェアハウスで動く19。

Snowpipe: ファイルが届くたびに、決めた COPY INTO を自動で動かす仕組みである。Snowflake が用意する計算資源で動き、クラウドストレージからの到着の知らせか、REST(Representational State Transfer)の API(Application Programming Interface)の呼び出しで、新しいファイルを知る20。

Snowpipe Streaming: ファイルではなく、行を SDK(Software Development Kit)や API で直接表に書き込む仕組みである19。遅れは短ければ 5 秒ほどである20。数秒で要るデータが行やイベントとして届くなら、こちらを使う20。

データベースや SaaS(Software as a Service)のアプリから直接取り込むなら、Snowflake のデータ連携のサービス Openflow のコネクタを使う2025。

dbt と運用

SQL の変換を定義し、テストし、デプロイするオープンソースの枠組みを dbt(dbt Core)といい26、ワークフローをプログラムで書き、スケジュールし、見張るプラットフォームを Airflow という27。Snowflake は、更新をこうした外のツールから動かす使い方も書いている1。dbt の Snowflake 用のアダプターは、Dynamic Tables を作れる28。dbt v1.12 以降では、scheduler と target_lag の両方を書かずに作ると SCHEDULER が DISABLE になり、Snowflake の自動の更新は動かず、dbt の実行が更新する。target_lag を書けば、Snowflake が自動で更新する28。Snowflake には、dbt のプロジェクトを Snowflake の中で動かし、タスクでスケジュールを組める dbt Projects on Snowflake もある26。

Snowflake の Well-Architected Framework は、オペレーショナルエクセレンスの柱で、パイプラインを含むすべての構成をコードとして管理し、自動のテストで本番での不具合の再発を防ぐよう勧めている29。データの取り込みは、COPY_HISTORY などのビューで、遅れと状態を見張るよう書いている29。

出典29件
  1. Snowflake「Dynamic tables | Snowflake Documentation」日付なし、2026年10月29日取得. https://docs.snowflake.com/en/user-guide/dynamic-tables/overview ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8

  2. Snowflake「Introduction to streams | Snowflake Documentation」日付なし、2026年10月29日取得. https://docs.snowflake.com/en/user-guide/streams-intro ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7

  3. Snowflake「Introduction to tasks | Snowflake Documentation」日付なし、2026年10月29日取得. https://docs.snowflake.com/en/user-guide/tasks-intro ↩ ↩2 ↩3 ↩4

  4. Snowflake「Create a dynamic table | Snowflake Documentation」日付なし、2026年10月29日取得. https://docs.snowflake.com/en/user-guide/dynamic-tables/create — 注文の表と、二段の Dynamic Tables の例と結果。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7

  5. Snowflake「Set the target lag for a dynamic table | Snowflake Documentation」日付なし、2026年10月29日取得. https://docs.snowflake.com/en/user-guide/dynamic-tables/target-lag — ターゲットラグは保証ではない。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7

  6. Snowflake「Dynamic table refresh modes | Snowflake Documentation」日付なし、2026年10月29日取得. https://docs.snowflake.com/en/user-guide/dynamic-tables/refresh-modes ↩ ↩2 ↩3 ↩4 ↩5 ↩6

  7. Snowflake「Decision guide for dynamic tables | Snowflake Documentation」日付なし、2026年10月29日取得. https://docs.snowflake.com/en/user-guide/dynamic-tables/decision-guide — Dynamic Tables、Streams と Tasks、マテリアライズドビューの使い分けと制限。 ↩ ↩2 ↩3 ↩4 ↩5

  8. Daniel Sotolongo ほか「Streaming Democratized: Ease Across the Latency Spectrum with Delayed View Semantics and Snowflake Dynamic Tables」SIGMOD-Companion 2025. https://arxiv.org/abs/2504.10438 ↩ ↩2

  9. Snowflake「Jul 30, 2026: Adaptive refresh mode for dynamic tables (General availability) | Snowflake Documentation」2026年7月30日、2026年10月29日取得. https://docs.snowflake.com/en/release-notes/2026/other/2026-07-30-dynamic-tables-adaptive-refresh-mode-ga ↩

  10. Snowflake「Supported queries for dynamic tables | Snowflake Documentation」日付なし、2026年10月29日取得. https://docs.snowflake.com/en/user-guide/dynamic-tables/supported-queries ↩ ↩2

  11. Snowflake「Choose and size warehouses for dynamic tables | Snowflake Documentation」日付なし、2026年10月29日取得. https://docs.snowflake.com/en/user-guide/dynamic-tables/warehouse-selection ↩

  12. Snowflake「Understanding costs for dynamic tables | Snowflake Documentation」日付なし、2026年10月29日取得. https://docs.snowflake.com/en/user-guide/dynamic-tables/cost ↩

  13. Snowflake「Monitor dynamic tables | Snowflake Documentation」日付なし、2026年10月29日取得. https://docs.snowflake.com/en/user-guide/dynamic-tables/monitoring ↩

  14. Snowflake「DYNAMIC_TABLE_REFRESH_HISTORY | Snowflake Documentation」日付なし、2026年10月29日取得. https://docs.snowflake.com/en/sql-reference/functions/dynamic_table_refresh_history ↩

  15. Snowflake「Custom incrementalization | Snowflake Documentation」日付なし、2026年10月29日取得. https://docs.snowflake.com/en/user-guide/dynamic-tables/custom-incrementalization ↩

  16. Snowflake「July 20, 2026: DML into frozen regions of dynamic tables (General availability) | Snowflake Documentation」2026年7月20日、2026年10月29日取得. https://docs.snowflake.com/en/release-notes/2026/other/2026-07-20-dynamic-tables-dml-frozen-regions ↩

  17. Snowflake「Create a sequence of tasks with a task graph | Snowflake Documentation」日付なし、2026年10月29日取得. https://docs.snowflake.com/en/user-guide/tasks-graphs ↩

  18. Snowflake「Triggered tasks | Snowflake Documentation」日付なし、2026年10月29日取得. https://docs.snowflake.com/en/user-guide/tasks-triggered ↩

  19. Snowflake「Overview of data loading | Snowflake Documentation」日付なし、2026年10月29日取得. https://docs.snowflake.com/en/user-guide/data-load-overview ↩ ↩2 ↩3 ↩4 ↩5

  20. Snowflake「Snowpipe | Snowflake Documentation」日付なし、2026年10月29日取得. https://docs.snowflake.com/en/user-guide/data-load-snowpipe-intro — 読み込みの遅れは保証しない。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9

  21. Snowflake「Loading data | Snowflake Documentation」日付なし、2026年10月29日取得. https://docs.snowflake.com/en/user-guide/data-load-considerations-load ↩

  22. Snowflake「COPY INTO <table> | Snowflake Documentation」日付なし、2026年10月29日取得. https://docs.snowflake.com/en/sql-reference/sql/copy-into-table ↩ ↩2

  23. Snowflake「Preparing your data files | Snowflake Documentation」日付なし、2026年10月29日取得. https://docs.snowflake.com/en/user-guide/data-load-considerations-prepare ↩

  24. Snowflake「Snowpipe costs | Snowflake Documentation」日付なし、2026年10月29日取得. https://docs.snowflake.com/en/user-guide/data-load-snowpipe-billing ↩

  25. Snowflake「About Openflow | Snowflake Documentation」日付なし、2026年10月29日取得. https://docs.snowflake.com/en/user-guide/data-integration/openflow/about ↩

  26. Snowflake「dbt Projects on Snowflake | Snowflake Documentation」日付なし、2026年10月29日取得. https://docs.snowflake.com/en/user-guide/data-engineering/dbt-projects-on-snowflake ↩ ↩2

  27. Apache Software Foundation「Apache Airflow」日付なし、2026年10月30日取得. https://airflow.apache.org/ ↩

  28. dbt Labs「Snowflake configurations | dbt Developer Hub」日付なし、2026年10月29日取得. https://docs.getdbt.com/reference/resource-configs/snowflake-configs ↩ ↩2

  29. Snowflake「Operational Excellence」Snowflake Well-Architected Framework、2026年6月17日更新、2026年10月29日取得. https://www.snowflake.com/en/developers/guides/well-architected-framework-operational-excellence/ ↩ ↩2

この記事はAIを使用して執筆されました。内容には誤りが含まれる可能性があります。事実や数字の出典は脚注から確かめられます。