모든 함수에는변동성분류, 가능성은 다음과 같습니다휘발성, 안정적또는불변. 휘발성다음의 경우 기본값입니다함수 생성명령은 그렇지 않습니다 카테고리를 지정하세요. 변동성 범주는 다음과 같은 약속입니다. 함수의 동작에 대한 최적화:
A 휘발성함수는 할 수 있습니다 데이터베이스 수정을 포함한 모든 것. 돌아올 수 있다 동일한 호출을 연속적으로 수행하면 다른 결과가 나타납니다. 인수. 옵티마이저는 어떤 가정도 하지 않습니다. 그러한 기능의 동작. 휘발성 함수를 사용한 쿼리 값이 있는 모든 행에서 함수를 다시 평가합니다. 필요합니다.
A 안정적함수는 수정할 수 없습니다. 동일한 결과를 반환하도록 보장됩니다. 단일 내의 모든 행에 대해 동일한 인수가 주어지면 성명. 이 카테고리를 사용하면 최적화 프로그램이 최적화할 수 있습니다. 함수를 여러 번 호출하면 단일 호출이 됩니다. 에서 특히, 다음과 같은 표현을 사용하는 것이 안전합니다. 인덱스 스캔 조건에서 작동합니다. (인덱스 스캔 이후 비교 값은 한 번이 아니라 한 번만 평가됩니다. 각 행에서 a를 사용하는 것은 유효하지 않습니다.휘발성인덱스 스캔의 함수 조건.)
안불변함수는 할 수 없습니다 데이터베이스를 수정하고 동일한 결과를 반환하도록 보장됩니다. 동일한 인수가 영원히 주어지는 결과. 이 카테고리 옵티마이저는 다음과 같은 경우 함수를 사전 평가할 수 있습니다. 쿼리는 상수 인수를 사용하여 이를 호출합니다. 예를 들어 쿼리 좋아요선택 ... 어디서 x = 2 + 2할 수 있다 눈에 띄게 단순화되다선택 ... x = 4, 왜냐하면 정수의 기본 함수가 덧셈 연산자가 표시됨불변.
최상의 최적화 결과를 얻으려면 함수에 라벨을 지정해야 합니다 유효한 가장 엄격한 변동성 범주를 사용합니다. 그들.
부작용이 있는 모든 사설 토토반드시라벨이 지정됨휘발성, 이에 대한 호출을 최적화할 수 없습니다. 멀리. 부작용이 없는 사설 토토이라도 라벨을 붙여야 합니다.휘발성그 값이 이내에 변경될 수 있는 경우 단일 쿼리; 몇 가지 예는 다음과 같습니다무작위(), currval(), timeofday().
상대적으로 차이가 거의 없습니다.안정적그리고불변간단한 대화형 쿼리를 고려할 때 카테고리 계획하고 즉시 실행합니다. 여부는 그다지 중요하지 않습니다. 함수는 계획 중에 한 번 또는 쿼리 중에 한 번 실행됩니다. 실행 시작. 하지만 계획대로라면 큰 차이가 있습니다 저장하고 나중에 다시 사용하세요. 함수에 라벨 지정불변실제로 그렇지 않은 경우에는 허용될 수도 있습니다. 계획 중에 조기에 상수로 접혀 결과적으로 계획의 후속 사용 중에 오래된 값이 재사용됩니다. 이는 준비된 문을 사용하거나 다음을 사용할 때 위험합니다. 계획을 캐시하는 함수 언어(예:PL/pgSQL).
MVCC의 스냅샷 동작으로 인해(참조12장)만 포함하는 함수선택명령은 안전하게 표시될 수 있습니다안정적, 다음과 같은 테이블에서 선택하더라도
  동시 쿼리로 인해 수정이 진행 중입니다.PostgreSQLa를 실행합니다안정적에 대해 설정된 스냅샷을 사용하는 함수
  호출 쿼리에 대한 고정된 뷰가 표시됩니다.
  해당 쿼리 전반에 걸쳐 데이터베이스. 또한 다음을 참고하세요.현재_타임스탬프함수 계열이 적합합니다.
  그 값이 일정 기간 동안 변하지 않기 때문에 안정적입니다.
  거래.
동일한 스냅샷 동작이 사용됩니다.선택내 명령불변함수. 일반적으로 현명하지 못한 행동입니다 내의 데이터베이스 테이블에서 선택불변기능이 전혀 없습니다. 불변성 이후 테이블 내용이 변경되면 깨집니다. 그러나PostgreSQL그것을 시행하지 않습니다 넌 그러지 마.
일반적인 오류는 함수에 라벨을 붙이는 것입니다.불변결과가 다음에 따라 달라질 때 구성 매개변수. 예를 들어, 조작하는 함수 타임스탬프에는 다음에 따라 결과가 있을 수 있습니다.시간대설정. 안전을 위해 이러한 사설 토토은 라벨로 표시되어야 합니다.안정적대신.
참고:이전PostgreSQL릴리스 8.0, 요구 사항 그안정적그리고불변함수는 데이터베이스를 수정할 수 없습니다 시스템에 의해 시행되지 않았습니다. 릴리스 8.0에서는 다음을 통해 이를 시행합니다. SQL 함수와 절차적 언어 함수가 필요한 이 범주에는 다음 이외의 SQL 명령이 포함되지 않습니다.선택. (완전히 그런건 아니지만 이러한 함수는 여전히 호출할 수 있으므로 방탄 테스트입니다.휘발성수정하는 함수 데이터베이스. 그렇게 하면 다음과 같은 결과가 나올 것입니다.안정적또는불변함수는 다음에 의해 적용된 데이터베이스 변경 사항을 인식하지 못합니다. 함수라고 합니다.)