Mímisbrunnr知恵の泉

← データエンジニアリング 一覧

🎓 レベル:標準 | 重要度:A(必須)

📎 前提:ETLとELT | 関連:べき等性と再実行メッセージキューとイベントストリーミング

要点(BLUF)

概念 ── 全部引くか、差分だけ引くか

全件洗い替えは毎回テーブル全部をコピーします。単純で確実ですが、巨大テーブルでは源と回線に重い。増分は「前回からの差分」だけ引くので軽い反面、「何が変わったか」を正しく知る仕掛けが要ります。

flowchart TB
    F["全件(full):毎回テーブル全部・単純だが重い"]
    I["増分(incremental):更新時刻/ID > 前回値 の行だけ"]
    C["CDC:ログを読み INSERT/UPDATE/DELETE を逐次捕捉"]

仕組み ── ハイウォーターマークによる増分

「前回取り込んだ最大の updated_at」を覚え、それより新しい行だけを引きます。

-- 前回の到達点(watermark)より新しい行だけ抽出
SELECT id, updated_at, payload
FROM source_events
WHERE updated_at > :watermark
ORDER BY id;
-- 取り込み後、watermark を MAX(updated_at) に更新して次回へ

実行結果(実機・SQLite):

初回ロード: 3 件取り込み, 新watermark=2026-06-02
増分ロード: 1 件取り込み(新着のみ), 新watermark=2026-06-03
sink合計: 4 件

初回は全件、その後は新着1件だけが入り、合計4件。watermarkを進めながら差分だけ引くのが増分取り込みの基本骨格です。取り込みはUPSERTにしておくと、同じ行が再度来ても二重にならない(→ べき等性と再実行)。

設計の勘所 ── 方式の選択

方式源への負荷削除の捕捉鮮度実装
全件洗い替え高い自然に反映低い(定期)容易
増分(watermark)低い苦手(消えた行が分からない)中(watermark管理)
CDC(ログ)極小得意(DELETEも拾う)高い高い(ログ連携・順序)

なぜそうするか ── 源を守りつつ最新を保つ

なぜ全件でなく増分・CDCを使うのか。源(本番DB)に負荷をかけず、かつ鮮度を上げるためです。本番DBに毎時フルスキャンを掛ければ業務が詰まります。増分なら差分だけ、CDCならログ読みで本番のクエリ系に触れずに済む。「源の健康を守る」のは取り込み設計の第一原則です。一方、増分は状態(watermark)を持つぶん壊れたときの復旧が要るので、べき等な再実行(→ べき等性と再実行)とセットで設計します。

⚠️ よくある落とし穴

対応ラボ

data-engineering-study/labs/04_etl_pipeline.pyPYTHONIOENCODING=utf-8 で実行・watermark増分を確認済み)。

関連

第4章 ETLとデータパイプライン 目次