compare_unrendered_code
compare_unrendered_code
compare_unrendered_code는 dbt State가 리소스를 재빌드할지 판단할 때, 렌더링된 SQL뿐 아니라 렌더링 전 Jinja 템플릿 원본까지 비교하게 해주는 설정이에요. 매 실행마다 값이 바뀌는 비결정적(non-deterministic) 매크로나 환경 변수를 쓰는 노드에서 불필요한 재빌드를 줄여줘요.
출처: 문서
본문
models:
<resource-path>:
+state:
compare_unrendered_code: true | false
models:
- name: my_model
config:
state:
compare_unrendered_code: true | false
{{ config(
state={
"compare_unrendered_code": true | false
}
) }}
정의 (Definition)
몇 가지 예를 볼까요. 다음은 매 실행마다 재빌드를 일으키는 비결정적 값들이에요:
{{ invocation_id() }}는 실행마다 새로운 값으로 풀리므로 항상 재빌드를 일으켜요.{{ dbt_utils.get_column_values() }}는 기본 컬럼 값이 바뀌거나 다른 순서로 반환될 때만 바뀌어서, 재빌드를 예측하기 어렵게 일으켜요.{{ modules.datetime.datetime.now().month }}는 한 달에 한 번만 새 값으로 풀리므로, 달이 바뀐 다음 실행에서 재빌드를 일으켜요.
compare_unrendered_code: true를 설정하면 이런 불필요한 재빌드를 피할 수 있어요. 이 설정을 켜면 dbt State가 렌더링되지 않은 Jinja 템플릿도 확인해서, 렌더링되지 않은 코드와 렌더링된 SQL이 둘 다 바뀌었을 때만 재빌드해요. 이는 템플릿 자체는 그대로인데 매 실행마다 다른 렌더링된 SQL을 만들어내는 비결정적 매크로나 환경 변수(UUID를 반환하는 매크로, {{ env_var('AIRFLOW_RUN_ID') }} 등)가 있는 노드에 유용해요.
evaluate_volatile_sql과의 상호작용
compare_unrendered_code가 켜져 있으면 dbt State는 렌더링되지 않은 Jinja 템플릿이 바뀌었는지 확인해요. 템플릿이 그대로라면 dbt State는 SQL 파싱을 완전히 건너뛰어요. volatile SQL 함수는 평가되지 않고 evaluate_volatile_sql도 아무 효과가 없어요. 렌더링되지 않은 템플릿이 바뀌었다면 dbt State는 렌더링된 SQL을 파싱·비교하고 evaluate_volatile_sql이 적용돼요.
예시 (Examples)
비결정적 환경 변수가 있는 모델
런타임에 환경 변수(예: AIRFLOW_RUN_ID)가 다른 값으로 풀리더라도, 모델 자신의 Jinja 템플릿이나 호출하는 매크로의 소스가 바뀌지 않는 한 모델을 재사용해요:
{{ config(state={"compare_unrendered_code": true}) }}
select
event_id,
user_id,
event_type,
occurred_at,
'{{ env_var("AIRFLOW_RUN_ID") }}' as airflow_run_id
from {{ ref('stg_events') }}
dbt 실행 메타데이터 컬럼이 있는 모델
invocation_id() 나 run_started_at 으로 각 행이 어느 dbt 실행에 의해 만들어졌는지 기록하는 모델은, 그 값들이 매 실행 다르게 풀리더라도 템플릿이 바뀌지 않는 한 재사용돼요:
{{ config(state={"compare_unrendered_code": true}) }}
select
*,
'{{ invocation_id() }}' as dbt_invocation_id,
'{{ run_started_at }}' as dbt_run_started_at
from {{ ref('stg_orders') }}
관련 문서 (Related docs)
더 알아보기 (Learn more)
- dbt State 설정 — State 관련 설정 모음
- evaluate_volatile_sql — volatile SQL 평가 설정