Reprocessing everything daily wastes resources. Incremental processing handles only new or changed data.
Patterns:
Append-only: New records added to existing table. Works for immutable event data.
Merge/Upsert: Update existing records, insert new ones. Requires unique key.
Partition replacement: Reprocess only affected partitions.
dbt incremental models:
{{ config(materialized='incremental') }}
SELECT * FROM {{ source('raw', 'events') }}
{% if is_incremental() %}
WHERE event_time > (SELECT MAX(event_time) FROM {{ this }})
{% endif %}
This reduces runtime from hours to minutes.