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