# Использование defer в dbt

Платформа dbt

[Defer](https://docs.getdbt.tech/reference/node-selection/defer.md) — это мощная возможность, которая позволяет разработчикам собирать, запускать и тестировать только те модели(Версии dbt: v1.11 и новее) и функции, которые они изменили, без необходимости собирать и запускать все предшествующие им модели(Версии dbt: v1.11 и новее) и функции (вышестоящие родительские узлы). Для этого dbt использует манифест production-окружения для сравнения и разрешает вызовы `{{ ref() }}`(Версии dbt: v1.11 и новее) и `{{ function() }}` с помощью вышестоящих артефактов production-окружения.

И Studio IDE, и dbt CLI позволяют пользователям обращаться к метаданным production-окружения с помощью встроенной поддержки defer непосредственно в процессе разработки.

[![Используйте 'defer', чтобы изменять модели в конце пайплайна, обращаясь к моделям production-окружения вместо запуска всех вышестоящих моделей.](/img/docs/reference/defer-diagram.png?v=2 "Используйте 'defer', чтобы изменять модели в конце пайплайна, обращаясь к моделям production-окружения вместо запуска всех вышестоящих моделей.")](#)Используйте 'defer', чтобы изменять модели в конце пайплайна, обращаясь к моделям production-окружения вместо запуска всех вышестоящих моделей.

При использовании `--defer` dbt разрешает вызовы `{{ ref() }}`(Версии dbt: v1.11 и новее) и `{{ function() }}` в следующем порядке.

1. Если версия объекта базы данных, к которому применяется defer, существует в окружении разработки, dbt при разрешении ссылки отдает предпочтение его расположению в базе данных разработки.
2. Если версии в окружении разработки нет, dbt использует расположения родительских объектов базы данных в staging-окружении на основе метаданных этого окружения.
3. Если нет ни версии в окружении разработки, ни staging-окружения, dbt использует расположения родительских объектов базы данных в production-окружении на основе метаданных этого окружения. Обратите внимание: в рамках одного вызова dbt применяет defer только к одному окружению — либо staging, либо production.

**Примечание:** При передаче флага `--favor-state` ссылки всегда разрешаются с использованием метаданных staging-окружения, если они доступны; в противном случае используются метаданные production-окружения независимо от наличия объекта базы данных в окружении разработки, а шаг № 1 пропускается.

Чтобы начинать с чистого состояния, рекомендуется удалять схему разработки в начале и в конце цикла разработки.

Если вам нужен дополнительный контроль над данными production-окружения, создайте [staging-окружение](https://docs.getdbt.tech/docs/deploy/deploy-environments.md#staging-environment), и dbt будет использовать его вместо production-окружения для разрешения вызовов `{{ ref() }}`(Версии dbt: v1.11 и новее) и `{{ function() }}`.

## Варианты настройки

Существует несколько способов настроить defer в dbt в зависимости от конфигурации вашего проекта:

* **dbt platform**: При использовании Studio IDE или dbt platform CLI defer управляется автоматически. При необходимости можно настроить `defer-env-id`, чтобы указать конкретное окружение. Подробнее о настройке см. в разделе [Настройка defer на платформе dbt](#set-up-deferral-in-the-dbt-platform).
* **Самостоятельно управляемые развертывания (`defer_to_target`)**: Если у вас включен [dbt State](https://docs.getdbt.tech/docs/deploy/dbt-state-about.md), задайте `defer_to_target` в `profiles.yml`, чтобы указать, к какому окружению dbt State должен обращаться при использовании defer. Подробнее о настройке см. в разделах [`defer_to_target`](https://docs.getdbt.tech/reference/resource-configs/defer-to-target.md) и [Настройка defer в dbt State](https://docs.getdbt.tech/docs/deploy/dbt-state-deferral.md).
* **Ручная настройка defer (`--state`)**: Явно передайте `--state` или `--defer-state`, чтобы указать dbt конкретный файл `manifest.json`. Подробнее об использовании см. в разделе [Defer](https://docs.getdbt.tech/reference/node-selection/defer.md).

Используйте dbt State для более интеллектуальной работы defer [Бета-версия](https://docs.getdbt.tech/docs/dbt-versions/product-lifecycles "Подробнее о статусе или тарифе")

В самостоятельно управляемых развертываниях с включенным [dbt State](https://docs.getdbt.tech/docs/deploy/dbt-state-about.md) селекторы `state:*` могут сравнивать каждый узел с его собственным последним выполнением, а не с единым файлом `manifest.json` — управлять манифестами не требуется. См. раздел [Селекторы `state:*` на базе dbt State](https://docs.getdbt.tech/docs/deploy/dbt-state-deferral.md#dbt-state-powered-state-selectors).

## Настройка defer на платформе dbt

* Необходимо установить флажок **[Production environment](https://docs.getdbt.tech/docs/deploy/deploy-environments.md#set-as-production-environment)** на странице **Environment Settings**.
  * Его можно установить для одного окружения развертывания в каждом проекте dbt.
* Сначала необходимо успешно выполнить задание.

При использовании defer для сравнения берутся артефакты последнего успешно выполненного задания в production-окружении, за исключением заданий CI.

В следующих разделах описано, как включить и настроить defer в Studio IDE и dbt platform CLI, а также как выбрать окружение, к которому dbt обращается при использовании defer.

### Defer в dbt IDE

Чтобы использовать defer в Studio IDE, необходимы артефакты production-окружения, созданные заданием развертывания. dbt сначала проверит наличие этих артефактов в staging-окружении (если оно доступно), а затем — в production-окружении.

Функция defer в Studio IDE не будет работать, если staging-окружение существует, но в нем еще не запускалось задание развертывания. Это связано с тем, что необходимые для работы defer метаданные появляются только после успешного выполнения задания развертывания в staging-окружении.

Чтобы включить defer в Studio IDE, активируйте переключатель **Defer to staging/production** на панели команд. После включения dbt будет:

1. Загружать последний манифест из staging- или production-окружения для сравнения
2. Передавать команде флаг `--defer` (для любой команды, поддерживающей этот флаг)

Например, если вы начнете разработку в новой ветке, когда [в вашей схеме разработки ничего нет](https://docs.getdbt.tech/reference/node-selection/defer.md#usage), измените одну модель и выполните `dbt build -s state:modified` — запустится только измененная модель. Все вызовы `{{ ref() }}`(Версии dbt: v1.11 и новее) и `{{ function() }}` будут разрешаться в расположения соответствующих моделей(Версии dbt: v1.11 и новее) и пользовательских функций в staging- или production-окружении.

[![Активируйте переключатель 'Defer to production' в правом нижнем углу панели команд, чтобы включить defer в Studio IDE.](/img/docs/dbt-platform/defer-toggle.png?v=2 "Активируйте переключатель 'Defer to production' в правом нижнем углу панели команд, чтобы включить defer в Studio IDE.")](#)Активируйте переключатель 'Defer to production' в правом нижнем углу панели команд, чтобы включить defer в Studio IDE.

[]()

### Defer в dbt platform CLI

Одно из ключевых отличий использования `--defer` в dbt platform CLI и Studio IDE заключается в том, что в dbt platform CLI `--defer` включен *автоматически* для всех вызовов, а сравнение выполняется с артефактами production-окружения. Отключить его можно с помощью флага `--no-defer`.

(Версии dbt: v2.0 и новее)

Чтобы автоматическое применение defer могло связать ваш проект с настройками, указанными в `dbt_cloud.yml`, в файле `dbt_project.yml` необходимо указать идентификатор проекта dbt platform.

dbt\_project.yml

```yml
dbt-cloud:
  project-id: '654321'
```

### Настройка идентификатора окружения для defer

И Studio IDE, и dbt platform CLI обеспечивают дополнительную гибкость, позволяя выбирать исходное окружение для артефактов defer. Вы можете вручную задать ключ `defer-env-id` в файле `[dbt_project.yml](/reference/dbt_project.yml)` (dbt platform CLI и Studio IDE) или `dbt_cloud.yml` (только dbt platform CLI). По умолчанию dbt отдает предпочтение метаданным из окружения проекта «Staging» (если оно определено). В противном случае используется «Production». Полное описание файла см. в разделе [`dbt_cloud.yml`](https://docs.getdbt.tech/reference/dbt_cloud.yml.md).

[![Задайте окружение для defer, и имя целевого окружения изменится в пользовательском интерфейсе.](/img/docs/dbt-platform/defer-env-id.png?v=2 "Задайте окружение для defer, и имя целевого окружения изменится в пользовательском интерфейсе.")](#)Задайте окружение для defer, и имя целевого окружения изменится в пользовательском интерфейсе.

dbt\_cloud.yml

```yml
context:
  active-host: ...
  active-project: ...
  defer-env-id: '123456'
```

dbt\_project.yml

```yml
dbt-cloud:
  project-id: '654321'
  defer-env-id: '123456'
```
