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') }}

더 알아보기 (Learn more)