volatility

volatility

volatility는 SQL, Python, JavaScript UDF의 출력이 얼마나 예측 가능한지 deterministic, stable, non-deterministic으로 설명하는 선택적 config예요. 웨어하우스는 이 정보를 바탕으로 결과를 캐시하거나 재정렬하거나 인라인할 수 있는지 판단해요. 함수를 캐시하거나 재정렬해도 안전하지 않을 때 잘못된 결과를 막으려면 적절한 volatility를 설정하는 게 중요해요. dbt v1.11부터 사용할 수 있어요.

출처: 문서

본문

알아두세요: dbt v1.11부터 또는 dbt "v1 Latest" 릴리스 트랙에서 사용할 수 있어요.

functions/.yml

functions:
  - name: <function name>
    config:
      volatility: deterministic | stable | non-deterministic

Definition

SQL, Python, JavaScript UDF에서 volatility config로 함수 출력의 예측 가능성을 deterministic, stable, non-deterministic 중에서 선언할 수 있어요. 웨어하우스는 이 정보로 결과를 캐시·재정렬·인라인할 수 있는지 판단해요. 함수를 캐시하거나 재정렬해도 안전하지 않을 때 잘못된 결과를 막으려면 적절한 volatility를 설정해 주세요.

예를 들어:

  • 난수를 반환하는 함수(random())는 호출할 때마다 출력이 바뀌므로 non-deterministic으로 설정해야 해요.
  • 오늘 날짜를 반환하는 함수(current_date())는 stable이에요. 값은 단일 쿼리 실행 안에서는 일관되지만 쿼리 사이에는 바뀔 수 있어요. 만약 deterministic으로 설정하면 웨어하우스가 값을 잘못 캐시해 다음 날에도 재사용할 수 있어요.

기본적으로 dbt는 volatility 값을 지정하지 않아요. 설정하지 않으면 dbt는 volatility 키워드 없는 CREATE 문을 생성하고, 웨어하우스의 기본 동작이 적용돼요 — Redshift는 예외예요.

Redshift에서는 명시적 volatility가 필요하고 VOLATILE이 가장 안전한 가정이므로, volatility를 지정하지 않으면 dbt가 기본적으로 non-deterministic(VOLATILE)을 설정해요.

웨어하우스별 volatility 키워드

웨어하우스마다 volatility 제어를 다른 키워드와 기본값으로 보여줘요.

SQL 및 Python UDF의 경우 BigQuery는 volatility 명시 설정을 지원하지 않고, 사용된 함수와 표현식에 따라 이를 추론해요. JavaScript UDF의 경우 BigQuery는 deterministicnon-deterministic만 지원하고 stable은 지원하지 않아요.

지원되는 volatility 타입

dbt에서 volatility config에 다음 값을 사용할 수 있어요.

Example

이 예시에서는 is_positive_int 함수에 deterministic volatility를 사용하고 있어요.

functions/schema.yml

functions:
  - name: is_positive_int
    description: Check whether a string is a positive integer
    config:
      volatility: deterministic # Optional: stable | non-deterministic | deterministic
    arguments:
      - name: a_string
        data_type: string
    returns:
      data_type: boolean