36.7.토토 베이 변동성 범주#

모든 함수가 a변동성가능성이있는 분류휘발성,안정적인또는불변.휘발성이면 기본값입니다.함수 만들기명령은 범주를 지정하지 않습니다. 변동성 범주는 기능의 동작에 대한 최적화에 대한 약속입니다.

  • a휘발성함수는 데이터베이스 수정을 포함하여 무엇이든 할 수 있습니다. 동일한 인수로 연속 통화에서 다른 결과를 반환 할 수 있습니다.

  • a안정적인함수는 데이터베이스를 수정할 수 없으며 단일 문의 모든 행에 대해 동일한 인수가 주어진 동일한 결과를 반환하도록 보장됩니다. 이 범주를 통해 Optimizer는 토토 베이의 여러 호출을 단일 호출로 최적화 할 수 있습니다.휘발성인덱스 스캔 조건에서 토토 베이.)

  • an불변함수는 데이터베이스를 수정할 수 없으며 동일한 인수가 영원히 주어진 동일한 결과를 반환하도록 보장됩니다. 이 범주를 사용하면 Optimizer가 쿼리가 일정한 인수로 호출 할 때 토토 베이을 사전 평가할 수 있습니다.선택 ... 여기서 x = 2 + 2시야에서 단순화 할 수 있습니다선택 ... 여기서 x = 4, 정수 추가 연산자의 기본 토토 베이이 표시되기 때문에불변.

최적의 최적화 결과를 위해서는 기능에 유효한 가장 엄격한 변동성 범주에 기능을 표시해야합니다..

부작용이있는 모든 함수필수라벨링휘발성, 따라서 호출을 최적화 할 수 없습니다. 부작용이없는 함수조차도 레이블을 지정해야합니다휘발성값이 단일 쿼리 내에서 변경 될 수있는 경우; 몇 가지 예는입니다.random (),currval (),TimeOfday ().

또 다른 중요한 예는입니다.current_timestamp토토 베이 가족 자격이안정적인, 거래 내에서 값이 변경되지 않으므로

간에 차이는 상대적으로 적습니다안정적인and불변범주 계획 및 즉시 실행되는 간단한 대화식 쿼리를 고려할 때 카테고리 : 계획 중에 또는 쿼리 실행 시작 중에 한 번 기능이 한 번 실행되는지 여부는 중요하지 않습니다. 그러나 계획이 나중에 저장되고 재사용되면 큰 차이가 있습니다.불변성실제로 그렇지 않은 경우 계획 중에 상수로 조기에 접을 수있을 수 있으며, 계획을 후속 사용하는 동안 오래된 가치가 재사용됩니다. 이것은 준비된 문을 사용하거나 계획을 사용하는 토토 베이 언어를 사용할 때 (예 :를 캐시하는 위험입니다.pl/pgsql).

SQL 또는 표준 절차 언어로 작성된 함수의 경우 변동성 범주에 의해 결정된 두 번째 중요한 속성, 즉 기능을 호출하는 SQL 명령에 의해 작성된 데이터 변경의 가시성이 있습니다. 에이휘발성함수는 그러한 변경 사항을 볼 수 있습니다.안정적인또는불변함수는 그렇지 않습니다. 이 동작은 MVCC의 스냅 샷 동작을 사용하여 구현됩니다 (참조PostgreSQL : 문서 : 17 : 13 장. 스포츠 토토 사이트 제어) :안정적인and불변함수는 호출 쿼리 시작 시점에서 설정된 스냅 샷을 사용하는 반면휘발성함수는 실행하는 각 쿼리의 시작 부분에서 새로운 스냅 샷을 얻습니다.

note

C로 작성된 토토 베이은 원하는 스냅 샷을 관리 할 수 ​​있지만 원하는대로 C 토토 베이을 이런 식으로 작동시키는 것이 좋습니다.

이 스냅 샷화 동작으로 인해 전용 함수select명령을 안전하게 표시 할 수 있습니다안정적인, 동시 쿼리에 의해 수정 될 수있는 테이블 중에서 선택하더라도.PostgreSQLa의 모든 명령을 실행합니다안정적인호출 쿼리를 위해 설정된 스냅 샷을 사용하여 함수하므로 해당 쿼리 전체에 데이터베이스의 고정 된보기가 표시됩니다..

동일한 스냅 샷 동작이 사용됩니다select불변함수. 일반적으로 AN 내 데이터베이스 테이블에서 선택하는 것은 현명하지 않습니다.불변테이블 내용이 변경되면 불변성이 고장되므로 기능합니다. 하지만,PostgreSQL당신이 그렇게하지 않는다는 것을 강요하지 않습니다.

일반적인 오류는 함수에 레이블을 지정하는 것입니다불변결과가 구성 매개 변수에 의존 할 때. 예를 들어, 타임 스탬프를 조작하는 함수는에 의존하는 결과가있을 수 있습니다.TimeZone설정. 안전을 위해서는 그러한 토토 베이이 레이블이 지정되어야합니다안정적인대신.

Note

PostgreSQL요구안정적인불변함수는 이외의 SQL 명령이 포함되어 있지 않습니다.select데이터 수정을 방지합니다. (이러한 토토 베이이 여전히 전화 할 수 있기 때문에 완전히 방탄 테스트가 아닙니다휘발성데이터베이스를 수정하는 토토 베이. 그렇게하면를 찾을 수 있습니다.안정적인또는불변함수는 스냅 샷에서 숨겨져 있기 때문에 호출 된 함수에 의해 적용되는 데이터베이스 변경을 알지 못합니다.)

정정 제출

문서에 올바르지 않은 내용이 있으면 일치하지 않습니다.이 양식문서 문제를보고하려면