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リフレッシュの対象となり、 変更されたデータのみを処理するためコスト効率が高くなります。
-- 基本的な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値 | ユースケース | コスト傾向 |
|---|---|---|
| 1 minute | ニアリアルタイムダッシュボード、不正検知 | 高(頻繁なリフレッシュ) |
| 5〜10 minutes | BIレポーティング、運用モニタリング | 中(バランス型) |
| 1 hour以上 | 日次バッチ集計、履歴分析 | 低(リフレッシュ頻度が低い) |
| 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;| 比較軸 | Dynamic Tables | Streams + Tasks |
|---|---|---|
| パラダイム | 宣言型(何が欲しいかを定義) | 手続型(どう処理するかを定義) |
| 依存管理 | 自動(DAGを内部構築) | 手動(Task Treeを自分で設計) |
| 増分処理 | 自動判定(Incremental/Full) | Streamのオフセット管理が必要 |
| SLA制御 | TARGET_LAGで宣言 | CRONスケジュールで制御 |
| エラー時の柔軟性 | リトライは自動 | Task側でリトライロジックを実装可能 |
Data Engineering
問題 1
メダリオンアーキテクチャで Bronze → Silver → Gold の3段のDynamic Tableパイプラインを構築する。BIダッシュボードはGoldテーブルを参照し、データの鮮度要件は10分以内である。Silverテーブルの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を設定する必要があります。
NicheeLab編集部
データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。
Snowflake資格一覧|全11試験(SnowPro)の難易度・費用
Snowflake認定資格(SnowPro)全11試験の一覧・難易度・費用・出題範囲を徹底解説。...
Snowflake試験の難易度ランキング|全11資格を徹底比較
Snowflake(SnowPro)認定全11試験の難易度をランキング形式で比較。学習時間・合格に必要なスキルから分析。...
Snowflake資格の勉強方法|効率的な学習ルートと合格のコツ
Snowflake認定資格(SnowPro)に最短で合格するための勉強方法。公式リソース・学習スケジュールを徹底ガイド。...
SnowPro Core試験完全解説|出題範囲・問題例・合格戦略
SnowPro Core Certification(COF-C03)を徹底解説。出題範囲・100問の試験形式・合格ライ...
SnowPro Platform Associate完全解説|入門試験の攻略
SnowPro Associate: Platform Certification(SOL-C01)を徹底解説。最も簡単...