--full-refresh forces dbt to rebuild incremental (and some other) models from scratch instead of applying a delta.
dbt run --full-refresh --select fct_orders dbt build --full-refresh --select fct_orders
Effect on incremental models
normal incremental run → is_incremental() true → merge/append delta --full-refresh → drop/rebuild (or equivalent) → full SELECT
is_incremental() evaluates to false during a full refresh, so your historical filter is skipped and the whole dataset is rebuilt.
When you need it
- Logic change that must rewrite old rows (new columns, fixed join bug)
- Bad data landed and merges cannot easily repair history
- Changing
unique_keyor incremental strategy - Schema drift that incremental apply cannot reconcile
Cost
Full refresh on a multi-terabyte fact can be expensive and long-running. Teams often full-refresh only selected models, or rebuild a bounded partition window instead.
Interview tip: "Incremental is the happy path; --full-refresh is the rebuild lever when history must be rewritten."