evaluate_volatile_sql
evaluate_volatile_sql
evaluate_volatile_sql은 dbt State가 재빌드 여부를 판단할 때 volatile SQL 함수의 런타임 결과값을 저장하고 비교할지를 정하는 설정이에요. CURRENT_TIMESTAMP() 같은 함수는 업스트림 데이터가 바뀌지 않아도 실행마다 다른 값을 내는데, 이런 노드를 언제 재빌드할지 제어할 수 있죠.
출처: 문서
본문
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
}
) }}
정의 (Definition)
dbt State는 노드의 부모 신선도(freshness)를 기준으로 노드의 데이터가 바뀌었는지 판단해요. 하지만 CURRENT_TIMESTAMP(), RANDOM(), UUID_STRING() 같은 volatile SQL 함수는 업스트림 데이터가 바뀌지 않아도 실행마다 노드의 출력을 바꿀 수 있어요.
기본적으로 dbt State는 volatile 함수를 노드 컴파일 코드의 정적 부분으로 취급해요. 새로운 데이터의 원천이 아니라 보는 거죠. 대부분의 경우 이 선택이 맞아요. 그렇지 않으면 CURRENT_TIMESTAMP()를 포함한 노드는 어떤 것도 재사용이 불가능해질 테니까요.
evaluate_volatile_sql이 true로 설정되면 dbt State는 각 volatile 함수 호출의 결과값을 저장하고 향후 비교에 그 저장된 값을 사용해요. 즉 함수의 출력이 바뀔 때 — 예를 들어 자정이 지나 current_date()가 새 값을 반환할 때 — 노드가 재빌드돼요.
| 값 | 동작 |
|---|---|
| false (기본값) | Volatile 함수를 정적 코드로 취급해요. 실행 간 함수 출력이 달라져도 노드를 재사용할 수 있어요. |
| true | dbt State가 volatile 함수의 런타임 결과를 저장·비교해요. 그 결과가 바뀌면 노드가 재빌드돼요. |
예시 (Examples)
날짜가 바뀔 때 재빌드하기
출력이 현재 날짜에 의미 있게 영향받는 노드에 evaluate_volatile_sql: true를 사용해요:
{{ config(state={"evaluate_volatile_sql": true}) }}
select
*,
account_created_at >= current_date() as signed_up_today
from {{ ref('dim_customers') }}
기본 동작
select
*,
getdate() as _dbt_built_at
from {{ ref('dim_customers') }}
관련 문서 (Related docs)
더 알아보기 (Learn more)
- compare_unrendered_code — 렌더링 전 코드 비교 설정
- dbt State 설정 — dbt State 설정 전체