大量データを効率的に処理する増分更新モデル
Incremental Model(増分モデル)は、既存のテーブルに対して新規データや変更データのみを追加・更新する、dbtの効率的なマテリアライゼーション方式です。 毎回全データを再構築するTABLEモデルと異なり、差分データだけを処理することで:
WHERE句の増分フィルタは適用されない。
CREATE TABLEで新規テーブルを作成し、全データを挿入。WHERE句で新規データだけフィルタリング。WHERE created_at > (SELECT MAX(created_at) FROM existing_table)
既存データと新規データをどのように統合するかを定義する方法。
materialized='incremental'とincremental_strategyで指定。
INSERT INTO table SELECT ...MERGE文(UPSERT)DELETE WHERE ... INSERT ...'incremental' を指定して増分モデルを有効化
'append': 追加のみ'merge': UPSERT(更新 or 挿入)'delete+insert': 削除してから挿入'insert_overwrite': パーティション上書き
'user_id'['order_id', 'item_id']
{'field': 'date', 'data_type': 'date', 'granularity': 'day'}
['user_id', 'product_id']
'ignore': 変更を無視(デフォルト)'fail': エラーで停止'append_new_columns': 新カラムを追加'sync_all_columns': 全カラムを同期
dbt run --full-refresh| 指標 | TABLEモデル | Incrementalモデル | 改善率 |
|---|---|---|---|
| 初回実行 | 45分 | 45分 | 同じ |
| 2回目以降 | 45分 | 2分 | 95%短縮 |
| スキャン量 | 500 GB | 5 GB | 99%削減 |
| コスト/日 | $50 | $0.5 | 99%削減 |
| 月間コスト | $1,500 | $15 | $1,485節約 |
シナリオ: Webアプリのクリックストリームデータを蓄積
appendevent_dateWHERE event_timestamp > MAX(event_timestamp)シナリオ: CRMからの顧客データをデータウェアハウスに同期
mergecustomer_idWHERE updated_at > MAX(updated_at)シナリオ: 日別・商品別の売上サマリを計算
delete+insertsale_dateシナリオ: データベースの変更ログをキャプチャ
mergeWHERE log_timestamp > MAX(log_timestamp)is_incremental() and is_deletedで削除処理シナリオ: 1時間ごとのシステムメトリクスを集計
insert_overwritemetric_hour(hourly granularity)| 項目 | 推奨事項 |
|---|---|
| フィルタ条件 | 必ず{% if is_incremental() %}内にWHERE句を記述。初回実行では全データ取得が必要 |
| パーティション設定 | 日付カラムでパーティション化すると、delete+insertやinsert_overwriteが効率的 |
| unique_key選択 | merge戦略では適切なキーを選択。複合キーも可能 |
| 遅延データ対応 | 過去数日分をlookback_windowで再処理することで遅延データをキャッチ |
| フルリフレッシュ | 定期的に--full-refreshでテーブルを再構築し、データ品質を維持 |
| モニタリング | 処理行数、実行時間、エラー率を監視。異常があればフルリフレッシュ |
| スキーマ変更 | on_schema_changeを適切に設定し、カラム追加・削除に対応 |
materialized='incremental'、is_incremental()でフィルタ