# evaluate\_volatile\_sql

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

dbt\_project.yml

```yaml
models:
  <resource-path>:
    +state:
      evaluate_volatile_sql: true | false
```

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

models/\<filename>.yml

```yaml
models:
  - name: my_model
    config:
      state:
        evaluate_volatile_sql: true | false
```

### Конфигурация в SQL-файле

models/\<filename>.sql

```sql
{{ config(
    state={
      "evaluate_volatile_sql": true | false
    }
) }}
```

## Определение

dbt State определяет, изменились ли данные узла, на основе актуальности данных его родительских узлов. Однако недетерминированные SQL-функции, такие как `CURRENT_TIMESTAMP()`, `RANDOM()` или `UUID_STRING()`, могут изменять результат узла от запуска к запуску, даже если данные вышестоящих узлов не изменились.

По умолчанию dbt State рассматривает недетерминированные функции как статические части скомпилированного кода узла, а не как источник новых данных. В большинстве случаев это правильный выбор — иначе ни один узел, содержащий `CURRENT_TIMESTAMP()`, нельзя было бы использовать повторно.

Когда для `evaluate_volatile_sql` установлено значение `true`, dbt State сохраняет *результат* каждого вызова недетерминированной функции и использует эти сохранённые значения для последующих сравнений. Это означает, что узел пересобирается при изменении результата функции — например, когда `current_date()` возвращает новое значение после полуночи.

| Значение               | Поведение                                                                                                                                                           |
| ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `false` (по умолчанию) | Недетерминированные функции рассматриваются как статический код. Узел можно использовать повторно, даже если результаты функций при разных запусках различались бы. |
| `true`                 | dbt State сохраняет и сравнивает результаты выполнения недетерминированных функций. Узел пересобирается при изменении этих результатов.                             |

## Примеры

### Пересборка при изменении даты

Используйте `evaluate_volatile_sql: true` для узла, на результат которого существенно влияет текущая дата:

models/\<filename>.sql

```sql
{{ config(state={"evaluate_volatile_sql": true}) }}

select
  *,
  account_created_at >= current_date() as signed_up_today
from {{ ref('dim_customers') }}
```

Если эта настройка включена, dbt State сохраняет результат `current_date()` после каждой сборки. При следующем запуске после полуночи сохранённое значение уже не совпадает с текущим, и узел пересобирается, даже если `dim_customers` не изменился.

### Поведение по умолчанию

Для узлов, в которых результат недетерминированной функции не влияет на бизнес-логику, дополнительная настройка не требуется:

models/\<filename>.sql

```sql
select
  *,
  getdate() as _dbt_built_at
from {{ ref('dim_customers') }}
```

dbt State рассматривает `getdate()` как статический код. Узел остаётся доступным для повторного использования, пока его родительские узлы не изменились.

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

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