# Настройки dbt State

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

* **Повторное использование** — если объект существует в целевой схеме, его логика не изменилась и время для повторной сборки в соответствии с `lag_tolerance` ещё не наступило (последняя сборка всё ещё находится в пределах допустимого интервала или данные вышестоящих узлов не изменились), узел используется повторно.
* **Клонирование** — если повторное использование невозможно, но объект существует в окружении, используемом для отложенного разрешения ссылок (deferral), с той же логикой и достаточно свежими данными, dbt State клонирует его.
* **Обычная сборка** — если ни повторное использование, ни клонирование невозможны, узел собирается как обычно, с использованием deferral для всех невыбранных вышестоящих узлов.

Используйте следующие настройки, чтобы управлять тем, как dbt State принимает эти решения.

### YAML-файл проекта

dbt\_project.yml

```yaml
models:
  +state:
    lag_tolerance: <duration>
    compare_unrendered_code: true | false
    require_fresh_data_from: any | all
    evaluate_volatile_sql: true | false
    pre_clone: never | if_missing | always
    execute_hooks_on_any_reuse: true | false
```

### YAML-файл свойств

models/schema.yml

```yaml
models:
  - name: <model_name>
    config:
      state:
        lag_tolerance: <duration>
        compare_unrendered_code: true | false
        require_fresh_data_from: any | all
        evaluate_volatile_sql: true | false
        pre_clone: never | if_missing | always
        execute_hooks_on_any_reuse: true | false
```

### Настройка в SQL-файле

models/\<filename>.sql

```sql
{{ config(
    state={
        "lag_tolerance": "<duration>",
        "compare_unrendered_code": true | false,
        "require_fresh_data_from": "any" | "all",
        "evaluate_volatile_sql": true | false,
        "pre_clone": "never" | "if_missing" | "always",
        "execute_hooks_on_any_reuse": true | false
    }
) }}
```

Параметры уровня профиля задаются в `profiles.yml` и применяются к определённому целевому окружению:

profiles.yml

```yaml
my_project:
  outputs:
    dev:
      type: snowflake
      # ... настройки подключения к dev
      defer_to_target: prod  # только для самостоятельно управляемых окружений
    prod:
      type: snowflake
      # ... настройки подключения к prod
      allow_clones: true | false
      metadata_warehouse: <warehouse_name>  # только для Snowflake
  target: dev
```

| Настройка                                                                                                          | По умолчанию           | Область действия                                          | Описание                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| ------------------------------------------------------------------------------------------------------------------ | ---------------------- | --------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [`lag_tolerance`](https://docs.getdbt.tech/reference/resource-configs/lag-tolerance.md)                           | `45m`                  | Уровень узла, папки или проекта через конфигурацию модели | Задаёт время ожидания dbt State перед повторной сборкой узла после изменения данных вышестоящих узлов. Узел пересобирается только тогда, когда с момента его последней сборки прошло больше указанного времени и данные вышестоящих узлов изменились. Этот интервал служит буфером для экономии вычислительных ресурсов и помогает согласовать сборки с SLA по свежести данных. Применяется только к свежести данных; изменения SQL всегда вызывают повторную сборку независимо от этой настройки. |
| [`compare_unrendered_code`](https://docs.getdbt.tech/reference/resource-configs/compare-unrendered-code.md)       | `false`                | Уровень узла, папки или проекта через конфигурацию модели | Определяет, проверяет ли dbt State при обнаружении изменений кода как шаблон Jinja (код до рендеринга), так и SQL после рендеринга. Полезно для моделей с недетерминированными макросами или переменными окружения, из-за которых при каждом запуске получается разный SQL после рендеринга.                                                                                                                                                                                                       |
| [`require_fresh_data_from`](https://docs.getdbt.tech/reference/resource-configs/require-fresh-data-from.md)       | `any`                  | Уровень узла, папки или проекта через конфигурацию модели | Определяет, должны ли свежие данные появиться у любого (`any`) или у всех (`all`) непосредственных родительских узлов, прежде чем узел сможет быть пересобран.                                                                                                                                                                                                                                                                                                                                     |
| [`pre_clone`](https://docs.getdbt.tech/reference/resource-configs/pre-clone.md)                                   | `if_missing`           | Уровень узла, папки или проекта через конфигурацию модели | Определяет, заполняет ли dbt State инкрементальные модели и снимки перед запуском, клонируя объекты из производственного окружения.                                                                                                                                                                                                                                                                                                                                                                |
| [`execute_hooks_on_any_reuse`](https://docs.getdbt.tech/reference/resource-configs/execute-hooks-on-any-reuse.md) | `false`                | Уровень узла, папки или проекта через конфигурацию модели | Определяет, выполняются ли хуки pre-hook и post-hook, когда узел используется повторно без пересборки.                                                                                                                                                                                                                                                                                                                                                                                             |
| [`evaluate_volatile_sql`](https://docs.getdbt.tech/reference/resource-configs/evaluate-volatile-sql.md)           | `false`                | Уровень узла, папки или проекта через конфигурацию модели | Определяет, сохраняет и сравнивает ли dbt State результаты выполнения волатильных SQL-функций при принятии решения о повторной сборке.                                                                                                                                                                                                                                                                                                                                                             |
| [`defer_to_target`](https://docs.getdbt.tech/reference/resource-configs/defer-to-target.md)                       | `prod`                 | Профиль                                                   | (Только для самостоятельно управляемых окружений) Указывает целевое окружение профиля, которое dbt State использует для deferral.                                                                                                                                                                                                                                                                                                                                                                  |
| [`allow_clones`](https://docs.getdbt.tech/reference/resource-configs/allow-clones.md)                             | `true`                 | Профиль                                                   | Определяет, может ли dbt State клонировать таблицы в целевое окружение. Например, установите `false` для `prod`, чтобы запретить dbt State клонировать таблицы из dev в производственное окружение.                                                                                                                                                                                                                                                                                                |
| [`metadata_warehouse`](https://docs.getdbt.tech/reference/resource-configs/metadata-warehouse.md)                 | `warehouse` из профиля | Профиль                                                   | (Только для Snowflake) Отдельный вычислительный склад для запросов метаданных dbt State. Если он задан, dbt выполняет несколько отдельных запросов (по одному на схему) вместо одного объединённого запроса.                                                                                                                                                                                                                                                                                       |

## Связанная документация

* [О dbt State](https://docs.getdbt.tech/docs/deploy/dbt-state-about.md)
* [Настройка dbt State](https://docs.getdbt.tech/docs/deploy/dbt-state-setup.md)
