Skip to content

PostgreSQL:Volatility

Function Volatility Categories - VOLATILE, STABLE, IMMUTABLE

세 가지 분류

  • VOLATILE - 호출할 때마다 결과가 달라질 수 있음 (기본값)
  • STABLE - 같은 트랜잭션 내에서 동일 인자 → 동일 결과 보장
  • IMMUTABLE - 언제나 동일 인자 → 동일 결과 보장

STABLE

  • 함수가 DB를 수정하지 않고, 같은 트랜잭션 안에서는 결과가 변하지 않음을 선언
  • 플래너가 이를 믿고 불필요한 재호출을 생략하는 최적화를 할 수 있음
  • 대표적 예: NOW(), current_user, 테이블을 SELECT만 하는 조회 함수
CREATE FUNCTION get_org_name(org_id UUID)
  RETURNS TEXT
  LANGUAGE sql
  STABLE          -- 같은 트랜잭션 내에선 org 이름이 안 바뀜
AS $$
  SELECT name FROM orgs WHERE id = org_id;
$$;

주의:

  • STABLE 함수는 인덱스 표현식의 DEFAULT 값으로 사용 불가 (IMMUTABLE만 가능)
  • 잘못 분류하면 플래너가 캐싱된 결과를 재사용해서 틀린 결과를 줄 수 있으므로, 실제 동작에 맞게 선언해야 합니다.

핵심 차이

속성

같은 인자로 호출 시 결과가 동일한 범위

DB 상태 접근

예시

IMMUTABLE

항상, 영원히 (DB 상태와 완전 독립)

❌ 금지 (테이블/시퀀스/now() 등 사용 불가)

lower(text), abs(int), md5(text)

STABLE

하나의 SQL 문 내에서 같은 결과

✅ 읽기 OK, 쓰기 ❌

now(), current_user, 테이블 SELECT

VOLATILE

매 호출마다 달라질 수 있음

✅ 읽기/쓰기 모두

random(), nextval(), INSERT/UPDATE 부수효과

한 줄 판단 기준

조건

선언

DB 를 전혀 읽지 않고 같은 인자에 항상 같은 답

IMMUTABLE

DB 를 읽지만 쓰지는 않고, 한 문장 안에서는 같은 답

STABLE

그 외 전부

VOLATILE

검증 매트릭스

선언

DB read

DB write

FOR UPDATE

random / now

RAISE

IMMUTABLE

STABLE

VOLATILE

*

*

(✅ 허용, ❌ 금지, * 무관)

See also

Favorite site