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 상태 접근 | 예시 |
| | 항상, 영원히 (DB 상태와 완전 독립) | ❌ 금지 (테이블/시퀀스/ | |
| | 하나의 SQL 문 내에서 같은 결과 | ✅ 읽기 OK, 쓰기 ❌ | |
| | 매 호출마다 달라질 수 있음 | ✅ 읽기/쓰기 모두 | |
한 줄 판단 기준
| 조건 | 선언 |
| DB 를 전혀 읽지 않고 같은 인자에 항상 같은 답 | |
| DB 를 읽지만 쓰지는 않고, 한 문장 안에서는 같은 답 | |
| 그 외 전부 | |
검증 매트릭스
| 선언 | DB read | DB write | FOR UPDATE | random / now | RAISE |
| | ❌ | ❌ | ❌ | ❌ | ✅ |
| | ✅ | ❌ | ❌ | ❌ | ✅ |
| | * | ✅ | ✅ | ✅ | * |
(✅ 허용, ❌ 금지, * 무관)