ストリームと変更データキャプチャ

Snowflakeにおけるデータパイプラインの自動化

Emily Melhuish

Technical Curriculum Developer, Snowflake

変更されたデータのみを処理する

CDC: 変更データキャプチャ データ処理方法の2つの比較

Snowflakeにおけるデータパイプラインの自動化

ストリーム

ストリームの機能

  • ソーステーブル上のすべてのINSERT、UPDATE、DELETEを追跡

Screenshot 2026-05-11 at 10.50.31 am.png

  • 変更ログを継続的に保持 — データの重複なし
  • 消費されるとオフセットが進む;次の読み取りは新たに開始
1 * Snowflake Learning Resource
Snowflakeにおけるデータパイプラインの自動化

ストリームの種類

 

ストリームタイプ キャプチャ対象 適したユースケース
Standard すべてのテーブル・ビュー、すべてのDML変更(INSERT・UPDATE・DELETE) 任意の行が変更されうるテーブル(例:shipments)
Append-only 外部テーブル以外のすべてのテーブル・ビュー、行のINSERTのみ 一度だけ挿入されるテーブル(例:配送イベント)- 高効率
Insert-only 外部管理のApache Icebergテーブルおよび外部テーブル、行のINSERTのみ 外部テーブル

ディレクトリテーブルはステージのファイルメタデータ(名前・サイズ・最終更新日時)を参照可能にする

Snowflakeにおけるデータパイプラインの自動化

ストリームの作成

shipmentsテーブルへのStandardストリーム

CREATE STREAM shipments_stream
  ON TABLE logistics.shipments;

delivery_eventsテーブルへのAppend-onlyストリーム

CREATE STREAM delivery_events_stream
  ON TABLE logistics.delivery_events
  APPEND_ONLY = TRUE;
Snowflakeにおけるデータパイプラインの自動化

ストリームメタデータカラム

SELECT product, quantity, METADATA$ACTION, METADATA$ISUPDATE, METADATA$ROW_ID
FROM shipments_stream;
  • METADATA$ACTION: INSERT または DELETE
  • METADATA$ISUPDATE: 更新ペアの一部の場合 TRUE
  • METADATA$ROW_ID: 行の一意な物理識別子
  • 更新は DELETE + INSERT のペアとして表示され、両方に METADATA$ISUPDATE = TRUE が設定される

METADATA$ACTION、METADATA$ISUPDATE、METADATA$ROW_IDカラムとサンプルデータを示すストリームメタデータカラム

Snowflakeにおけるデータパイプラインの自動化

ストリームオフセット

タイムライン図 - ストリーム作成(オフセット開始)→ ソーステーブルで変更が発生(ストリームにレコードが蓄積)→ トランザクションでストリームが消費(オフセットが現在時刻に進む)

Snowflakeにおけるデータパイプラインの自動化

パイプラインにおけるストリームの概要

  • ストリームはタスクと組み合わせて使用 — スケジュールに従ってSQLを実行するSnowflakeオブジェクト
  • タスクは変更行のみを読み取る。1,000万行の場合:2秒 vs 2分

Screenshot 2026-05-11 at 10.48.51 am.png

1 * Snowflake Learning Resource
Snowflakeにおけるデータパイプラインの自動化

パイプラインにおけるストリームのクエリ

  • ストリームはタスクと組み合わせて使用 - スケジュールに従ってSQLを実行するSnowflakeオブジェクト
  • タスクは変更行のみを読み取る。1,000万行の場合:2秒 vs 2分
CREATE TASK logistics.sync_shipments
  WAREHOUSE = compute_wh
  SCHEDULE = '5 MINUTE'
  WHEN SYSTEM$STREAM_HAS_DATA('logistics.staging_shipments_stream')
AS
  INSERT INTO logistics.shipments
  SELECT shipment_id, region, carrier, delivery_days
  FROM logistics.staging_shipments_stream
  WHERE METADATA$ACTION = 'INSERT';
Snowflakeにおけるデータパイプラインの自動化

練習しましょう!

Snowflakeにおけるデータパイプラインの自動化

Preparing Video For Download...