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는 deterministic과 non-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
Related documentation
- User-defined functions
- Function properties
- Function configurations
- type
- arguments
- returns