Snowflake

Snowflake Dynamic Tables宣言型パイプライン

2026-03-26
更新: 2026-03-27
NicheeLab編集部

Dynamic Tablesは、Snowflakeが提供する宣言型データパイプラインの仕組みです。 従来のStreams+Tasksでは「どのように変換するか」「いつ実行するか」を手続的に定義する必要がありましたが、 Dynamic Tablesでは「最終的にどのような結果セットが欲しいか」をSELECT文で宣言するだけで、 Snowflakeがリフレッシュスケジュール・増分処理・依存関係の解決をすべて自動管理します。

宣言型パイプラインの基本概念

Dynamic Tablesは内部的にDAG(有向非巡回グラフ)を形成します。 ソーステーブルAを参照するDynamic Table Bと、Bを参照するDynamic Table Cがある場合、 Snowflakeは自動的にA→B→Cの依存関係を検出し、適切な順序でリフレッシュを実行します。 ユーザーがTaskの実行順序やStream消費タイミングを管理する必要はありません。

リフレッシュにはIncremental(増分)Full(全量)の2モードがあり、 Snowflakeがクエリの内容を解析して自動的に最適なモードを選択します。 単純なSELECT / JOIN / WHERE / GROUP BYで構成されるクエリはIncrementalリフレッシュの対象となり、 変更されたデータのみを処理するためコスト効率が高くなります。

CREATE DYNAMIC TABLE構文

-- 基本的なDynamic Tableの作成
CREATE OR REPLACE DYNAMIC TABLE silver_orders
  TARGET_LAG = '5 minutes'
  WAREHOUSE = transform_wh
AS
  SELECT
    o.order_id,
    o.order_date,
    o.customer_id,
    c.customer_name,
    c.segment,
    o.total_amount
  FROM raw.orders o
  JOIN raw.customers c ON o.customer_id = c.customer_id
  WHERE o.order_date >= '2025-01-01';

-- 作成後の確認
SHOW DYNAMIC TABLES LIKE 'SILVER_ORDERS';
DESCRIBE DYNAMIC TABLE silver_orders;

TARGET_LAGはソースデータの変更がDynamic Tableに反映されるまでの最大許容遅延です。WAREHOUSEはリフレッシュ処理に使用するウェアハウスを指定します。

TARGET_LAGの設計指針

TARGET_LAG値ユースケースコスト傾向
1 minuteニアリアルタイムダッシュボード、不正検知高(頻繁なリフレッシュ)
5〜10 minutesBIレポーティング、運用モニタリング中(バランス型)
1 hour以上日次バッチ集計、履歴分析低(リフレッシュ頻度が低い)
DOWNSTREAMDAG中間テーブル(下流のラグに自動追従)下流の設定に依存

DOWNSTREAMによるDAG依存解決

メダリオンアーキテクチャのように複数のDynamic Tableをチェーンする場合、 中間レイヤーにはTARGET_LAG = DOWNSTREAMを設定します。 最下流のDynamic Tableに具体的なラグ値を設定すると、 Snowflakeが逆算して上流の各テーブルのリフレッシュタイミングを自動調整します。

-- Bronze → Silver → Gold のメダリオンパイプライン

-- Silver層: DOWNSTREAMで下流に追従
CREATE OR REPLACE DYNAMIC TABLE silver_daily_sales
  TARGET_LAG = DOWNSTREAM
  WAREHOUSE = transform_wh
AS
  SELECT
    DATE_TRUNC('DAY', order_date) AS sale_date,
    product_category,
    COUNT(*) AS order_count,
    SUM(total_amount) AS revenue
  FROM bronze_orders
  GROUP BY 1, 2;

-- Gold層: 具体的なラグ値を設定(DAG末端)
CREATE OR REPLACE DYNAMIC TABLE gold_sales_summary
  TARGET_LAG = '10 minutes'
  WAREHOUSE = transform_wh
AS
  SELECT
    sale_date,
    product_category,
    order_count,
    revenue,
    revenue / NULLIF(order_count, 0) AS avg_order_value
  FROM silver_daily_sales
  WHERE sale_date >= DATEADD(MONTH, -12, CURRENT_DATE());

リフレッシュ監視

Dynamic Tableのリフレッシュ履歴はINFORMATION_SCHEMA.DYNAMIC_TABLE_REFRESH_HISTORYテーブル関数およびACCOUNT_USAGE.DYNAMIC_TABLE_REFRESH_HISTORYビューで確認できます。

-- 直近24時間のリフレッシュ履歴を確認
SELECT
  name,
  refresh_trigger,
  refresh_action,       -- INCREMENTAL or FULL
  state,                -- SUCCEEDED / FAILED / CANCELLED
  state_message,
  data_timestamp,
  refresh_start_time,
  refresh_end_time,
  DATEDIFF('SECOND', refresh_start_time, refresh_end_time) AS duration_sec
FROM TABLE(INFORMATION_SCHEMA.DYNAMIC_TABLE_REFRESH_HISTORY(
  NAME_PREFIX => 'SILVER_',
  ERROR_ONLY => FALSE
))
WHERE refresh_start_time >= DATEADD(HOUR, -24, CURRENT_TIMESTAMP())
ORDER BY refresh_start_time DESC;

運用操作

-- TARGET_LAGの変更
ALTER DYNAMIC TABLE silver_orders SET TARGET_LAG = '15 minutes';

-- ウェアハウスの変更
ALTER DYNAMIC TABLE silver_orders SET WAREHOUSE = new_transform_wh;

-- リフレッシュの一時停止と再開
ALTER DYNAMIC TABLE silver_orders SUSPEND;
ALTER DYNAMIC TABLE silver_orders RESUME;

-- 手動リフレッシュ(デバッグ・検証用)
ALTER DYNAMIC TABLE silver_orders REFRESH;

Streams/Tasksとの違い

比較軸Dynamic TablesStreams + Tasks
パラダイム宣言型(何が欲しいかを定義)手続型(どう処理するかを定義)
依存管理自動(DAGを内部構築)手動(Task Treeを自分で設計)
増分処理自動判定(Incremental/Full)Streamのオフセット管理が必要
SLA制御TARGET_LAGで宣言CRONスケジュールで制御
エラー時の柔軟性リトライは自動Task側でリトライロジックを実装可能

設計ベストプラクティス

  • 末端に具体ラグ、中間はDOWNSTREAM:DAGの末端テーブルにのみTARGET_LAGの時間値を設定し、中間テーブルはDOWNSTREAMで自動調整させる
  • IncrementalリフレッシュをSELECT設計で活かす:WINDOW関数やSELECT DISTINCTを避け、JOIN / GROUP BY / WHEREベースのSQLにすることでIncremental対象になる確率が上がる
  • 専用ウェアハウスを割り当てる:クエリワークロードとリフレッシュワークロードが競合しないよう、Dynamic Table用のウェアハウスを分離する
  • DYNAMIC_TABLE_REFRESH_HISTORYで継続監視:Full Refreshが意図せず頻発していないか、リフレッシュ失敗が起きていないかを定期的に確認する
  • 初期ロード時はウェアハウスサイズを一時的に拡大:初回のFull Refreshは全データを処理するため、通常より大きいウェアハウスサイズを使い、完了後に元のサイズに戻す

問題で確認

Data Engineering

問題 1

メダリオンアーキテクチャで Bronze → Silver → Gold の3段のDynamic Tableパイプラインを構築する。BIダッシュボードはGoldテーブルを参照し、データの鮮度要件は10分以内である。SilverテーブルのTARGET_LAGとして最も適切な設定はどれか。

  1. TARGET_LAG = '10 minutes'(Goldと同じ値を明示設定)
  2. TARGET_LAG = '1 minute'(最小ラグで最大鮮度を確保)
  3. TARGET_LAG = DOWNSTREAM(下流のGoldテーブルのラグに自動追従)
  4. TARGET_LAGは省略可能であり、設定しなくてもよい

正解: C

DAGの中間テーブルにはTARGET_LAG = DOWNSTREAMを設定するのがベストプラクティスです。Snowflakeが末端のGold(10分)から逆算してSilverのリフレッシュタイミングを自動調整するため、個別に値を設定する必要がありません。Aのように同じ値を設定すると不必要にリフレッシュが発生する可能性があり、Bではコスト過多になります。DのようにTARGET_LAGを省略するとDynamic Tableの作成自体がエラーになります。

よくある質問

Dynamic TablesのTARGET_LAGを短く設定するとコストはどう変わりますか?

TARGET_LAGを短く(例: 1 minute)設定すると、Snowflakeはソーステーブルの変更を短い間隔で検知しリフレッシュを実行するため、Serverless Creditの消費が増加します。ソースの変更頻度が低い場合でもポーリングコストが発生するため、ビジネス要件で許容されるなら5〜10分程度に設定し、コストと鮮度のバランスを取ることが推奨されます。DYNAMIC_TABLE_REFRESH_HISTORYビューでリフレッシュ頻度とクレジット消費を定期的に確認してください。

Dynamic Tablesで使えないSQL構文はありますか?

Dynamic TablesのAS句に指定するSELECT文では、非決定論的関数(CURRENT_TIMESTAMP()、RANDOM()など)、ストアドプロシージャ呼び出し、UDF内での外部関数呼び出し、LIMIT / OFFSET句は使用できません。また、WINDOWファンクションは利用可能ですが、Incrementalリフレッシュの対象外となりFull Refreshが発生するケースがあります。設計時にはリフレッシュモード(Incremental vs Full)への影響を意識してSQL構文を選定する必要があります。

Dynamic TablesのDOWNSTREAM設定とは何ですか?

TARGET_LAGにDOWNSTREAMを指定すると、そのDynamic Table自身にはTARGET_LAGの時間値を直接設定せず、下流(依存先)のDynamic Tableが持つTARGET_LAGに基づいてリフレッシュスケジュールが自動調整されます。DAG全体のリフレッシュ整合性をSnowflakeが管理してくれるため、中間テーブルに個別のラグ値を設定する手間が省けます。末端(最下流)のDynamic Tableには必ず具体的な時間値のTARGET_LAGを設定する必要があります。

この記事で学んだ内容を問題で確認しましょう

16,000問以上の問題で実力チェック

無料で問題を解いてみる
この記事の著者

NicheeLab編集部

データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。


関連記事
Snowflake

Snowflake資格一覧|全11試験(SnowPro)の難易度・費用

Snowflake認定資格(SnowPro)全11試験の一覧・難易度・費用・出題範囲を徹底解説。...

Snowflake

Snowflake試験の難易度ランキング|全11資格を徹底比較

Snowflake(SnowPro)認定全11試験の難易度をランキング形式で比較。学習時間・合格に必要なスキルから分析。...

Snowflake

Snowflake資格の勉強方法|効率的な学習ルートと合格のコツ

Snowflake認定資格(SnowPro)に最短で合格するための勉強方法。公式リソース・学習スケジュールを徹底ガイド。...

Snowflake

SnowPro Core試験完全解説|出題範囲・問題例・合格戦略

SnowPro Core Certification(COF-C03)を徹底解説。出題範囲・100問の試験形式・合格ライ...

Snowflake

SnowPro Platform Associate完全解説|入門試験の攻略

SnowPro Associate: Platform Certification(SOL-C01)を徹底解説。最も簡単...

Snowflakeの記事一覧 (102件)
© 2026 NicheeLab All rights reserved.