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