# Оптимизация сборок dbt

По умолчанию dbt пересобирает каждый выбранный узел при каждом запуске — даже если ничего не изменилось. Это упрощает начало работы, но в крупных проектах приводит к увеличению времени выполнения заданий, росту затрат на хранилище данных и замедлению обратной связи при разработке. В dbt есть возможности, позволяющие пропускать ненужную работу и повторно использовать существующие результаты.

## dbt State

[dbt State](https://docs.getdbt.tech/docs/deploy/dbt-state-about.md) — это сервис, который помогает dbt более обоснованно выбирать, что нужно собирать. Он интегрируется с любым развертыванием dbt — в том числе с развертываниями в собственной инфраструктуре на базе dbt v2 или dbt v1 — без необходимости оформлять регулярную подписку на dbt platform.

Вместо того чтобы пересобирать каждый узел при каждом запуске, сервис сравнивает логику каждого узла и данные вышестоящих зависимостей с предыдущим запуском и выбирает наиболее эффективный вариант:

* **Пропустить** — Если логика узла и данные вышестоящих зависимостей не изменились, dbt повторно использует существующий объект в целевой схеме без изменений.
* **Клонировать** — Если данные актуальны, но находятся в другой схеме (например, в рабочей среде), dbt клонирует их вместо пересборки с нуля.
* **Собрать** — Если повторное использование невозможно, dbt выполняет обычную пересборку и автоматически перенаправляет ссылки на невыбранные вышестоящие узлы в рабочую среду — флаги `--defer` и `--state` не требуются.

Чтобы включить dbt State:

* **dbt v1.7–1.12**:

  ```bash
  cd path/to/your/project
  pip install dbt-state
  ```

* **dbt v2**:

  ```bash
  cd path/to/your/project
  dbt login
  ```

Для аутентификации требуется учетная запись dbt platform с [бесплатным пробным периодом на 30 дней](https://docs.getdbt.tech/docs/deploy/dbt-state-trial.md). Стоимость dbt State зависит от использования — плата взимается за каждую целевую таблицу, которую dbt State повторно использует в течение дня, а не за каждое пользовательское место в dbt platform. Полные инструкции по настройке приведены в разделе [Настройка dbt State](https://docs.getdbt.tech/docs/deploy/dbt-state-setup.md).

## Отложенное разрешение ссылок

[Отложенное разрешение ссылок](https://docs.getdbt.tech/reference/node-selection/defer.md) позволяет собирать часть проекта без предварительной сборки всех вышестоящих зависимостей. Вместо выполнения всех вышестоящих узлов dbt направляет ссылки на несобранные узлы к существующим объектам в другой среде — обычно в рабочей.

Это полезно в средах разработки и CI, когда нужно протестировать одну или две модели, не дожидаясь выполнения всего пайплайна.

```bash
dbt build --select my_model --defer --state path/to/prod/artifacts
```

## dbt clone

[`dbt clone`](https://docs.getdbt.tech/reference/commands/clone.md) создает копии выбранных узлов в целевой схеме. В хранилищах данных, поддерживающих клонирование без копирования данных (например, Snowflake), команда создает легковесные клоны объектов базы данных без дублирования лежащих в их основе данных. В других хранилищах она создает представления, ссылающиеся на вышестоящие объекты базы данных.

Это полезно при разработке, когда нужно быстро наполнить среду разработки объектами, аналогичными объектам рабочей среды, без выполнения всего пайплайна.

```bash
dbt clone --select my_model
```

## Синтаксис выбора узлов в dbt

В dbt есть [различные селекторы](https://docs.getdbt.tech/reference/node-selection/syntax.md), с помощью которых можно выбирать определенные части проекта, вместо того чтобы каждый раз собирать всё. Например, `+my_model` выбирает `my_model` и все ее вышестоящие зависимости, а `my_model+2` выбирает `my_model` и два уровня нижестоящих зависимых узлов. Это позволяет тестировать изменения изолированно, не выполняя весь проект.

```bash
dbt build --select +my_model
```
