evaluate_volatile_sql
- YAML-файл проекта
- YAML-файл свойств
- Конфигурация в SQL-файле
models:
<resource-path>:
+state:
evaluate_volatile_sql: true | false
models:
- name: my_model
config:
state:
evaluate_volatile_sql: true | false
{{ 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 для узла, на результат которого существенно влияет текущая дата:
{{ 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 не изменился.
Поведение по умолчанию
Для узлов, в которых результат недетерминированной функции не влияет на бизнес-логику, дополнительная настройка не требуется:
select
*,
getdate() as _dbt_built_at
from {{ ref('dim_customers') }}
dbt State рассматривает getdate() как статический код. Узел остаётся доступным для повторного использования, пока его родительские узлы не изменились.