모든 함수는 a에 있습니다.변동성가능성이있는 분류휘발성
,안정적인
또는불변
.휘발성
이면 기본값입니다.함수 만들기명령은 범주를 지정하지 않습니다. 변동성 범주는 기능의 동작에 대한 최적화에 대한 약속입니다.
a휘발성
함수는 데이터베이스 수정을 포함하여 무엇이든 할 수 있습니다. 동일한 인수로 연속 통화에서 다른 결과를 반환 할 수 있습니다.
a안정적인
함수는 데이터베이스를 수정할 수 없으며 단일 문의 모든 행에 대해 동일한 인수가 주어진 동일한 결과를 반환하도록 보장됩니다. 이 범주를 통해 Optimizer는 토토 캔의 여러 호출을 단일 호출로 최적화 할 수 있습니다.휘발성
인덱스 스캔 조건에서 토토 캔.)
an불변
함수는 데이터베이스를 수정할 수 없으며 동일한 인수가 영원히 주어진 동일한 결과를 반환하도록 보장됩니다. 이 범주를 사용하면 Optimizer가 쿼리가 일정한 인수로 호출 할 때 토토 캔을 사전 평가할 수 있습니다.선택 ... 여기서 x = 2 + 2
시야에서 단순화 할 수 있습니다선택 ... 여기서 x = 4
, 정수 추가 연산자의 기본 토토 캔이 표시되기 때문에불변
.
최적의 최적화 결과를 얻으려면 기능을 가장 엄격한 변동성 범주로 표시해야합니다.
부작용이있는 모든 함수필수라벨링휘발성
, 따라서 호출을 최적화 할 수 없습니다. 부작용이없는 함수조차도 레이블을 지정해야합니다휘발성
값이 단일 쿼리 내에서 변경 될 수있는 경우; 몇 가지 예는입니다.random ()
,currval ()
,TimeOfday ()
.
또 다른 중요한 예는입니다.current_timestamp
토토 캔 가족 자격 자격안정적인
, 값은 거래 내에서 값이 변경되지 않으므로
간에는 상대적으로 큰 차이가 있습니다안정적인
and불변
계획 및 즉시 실행되는 간단한 대화식 쿼리를 고려할 때 카테고리 : 계획 중에 또는 쿼리 실행 시작 중에 한 번 기능이 한 번 실행되는지 여부는 중요하지 않습니다. 그러나 계획이 나중에 저장되고 재사용되면 큰 차이가 있습니다.불변
실제로 그렇지 않은 경우 계획 중에 상수로 조기에 접을 수있을 수 있으며, 이후 계획의 후속 사용 중에는 오래된 가치가 재사용됩니다. 이것은 준비된 문을 사용하거나 계획을 사용하는 토토 캔 언어를 사용할 때 (예 :를 캐시하는 위험입니다.pl/pgsql).
SQL 또는 표준 절차 언어로 작성된 함수의 경우 변동성 범주에 의해 결정된 두 번째 중요한 속성, 즉 기능을 호출하는 SQL 명령에 의해 작성된 데이터 변경의 가시성이 있습니다. 에이휘발성
함수는 그러한 변경 사항을 볼 수 있습니다.안정적인
또는불변
함수는 그렇지 않습니다. 이 동작은 MVCC의 스냅 샷 동작을 사용하여 구현됩니다 (참조PostgreSQL : 문서 : 10 : 13 장. 무지개 토토 제어) :안정적인
and불변
함수는 호출 쿼리 시작 시점에서 설정된 스냅 샷을 사용하지만휘발성
함수는 실행하는 각 쿼리의 시작 부분에서 새로운 스냅 샷을 얻습니다.
C로 작성된 토토 캔은 원하는 스냅 샷을 관리 할 수 있지만 원하는대로 C 토토 캔을 이런 식으로 작동시키는 것이 좋습니다.
이 스냅 샷화 동작으로 인해 전용 함수select
명령은 안전하게 표시 될 수 있습니다안정적인
, 동시 쿼리에 의해 수정 될 수있는 테이블 중에서 선택하더라도.PostgreSQLa의 모든 명령을 실행합니다안정적인
호출 쿼리를 위해 설정된 스냅 샷을 사용하여 함수하므로 해당 쿼리 전체에 데이터베이스의 고정 된보기가 표시됩니다..
동일한 스냅 샷 동작이 사용됩니다select
내 명령불변성
토토 캔. 일반적으로 AN 내 데이터베이스 테이블에서 선택하는 것은 현명하지 않습니다.불변
테이블 내용이 변경되면 불변성이 고장되므로 기능합니다. 하지만,PostgreSQL당신이 그렇게하지 않는다는 것을 강요하지 않습니다.
일반적인 오류는 함수에 레이블을 지정하는 것입니다불변
결과가 구성 매개 변수에 의존 할 때. 예를 들어, 타임 스탬프를 조작하는 함수는에 의존하는 결과가있을 수 있습니다.TimeZone설정. 안전을 위해서는 그러한 토토 캔이 레이블이 지정되어야합니다안정적인
대신.
postgresql요구안정적인
and불변
함수는 이외의 SQL 명령이 포함되어 있지 않습니다.select
데이터 수정을 방지합니다. (이러한 토토 캔이 여전히 전화 할 수 있기 때문에 완전히 방탄 테스트가 아닙니다휘발성
데이터베이스를 수정하는 토토 캔. 그렇게하면를 찾을 수 있습니다.안정적인
또는불변
함수는 스냅 샷에서 숨겨져 있기 때문에 호출 된 함수에 의해 적용되는 데이터베이스 변경을 알지 못합니다.)