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