In a development schema most tables do not exist yet. Without deferral, building one model means building all its parents first. With deferral, dbt resolves every ref() to a model you have not built yourself to the production table, so you build only what you are changing.

Copy and paste

Studio IDE: turn on Defer to staging/production in the command bar.

dbt platform CLI: deferral is on by default. To turn it off for one command:

dbt build -s my_model --no-defer

Defer to a specific environment, for example a staging one:

# dbt_project.yml
dbt-cloud:
  project-id: '654321'
  defer-env-id: '123456'

Deploy and CI jobs: in the job’s settings, Compare changes against an environment, or against the job’s own last run.

How dbt resolves a ref()

With deferral on, for each model you did not select:

  1. if your development schema has the model, dbt uses it;
  2. otherwise, if a staging environment exists, dbt uses the staging table;
  3. otherwise, it uses the production table.

dbt defers to one environment per command, staging or production, never both. --favor-state skips the first step and always uses the staging or production table, even when you have your own copy.

What deferral needs

When it helps and when it does not

The same mechanism works in dbt Core with --defer --state; see how to run only modified models.

Based on the dbt platform documentation (October 2026); not run against a live dbt account.

References