이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
당신은 다음과 같은 페이지를 보고 싶을 수도 있습니다.PostgreSQL : 문서 : 17 : 36.7. 사설 토토 사이트 변동성 범주버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

35.6. 함수 변동성 카테고리

모든 함수에는변동성분류, 가능성은 다음과 같습니다휘발성, 안정적또는불변. 휘발성다음의 경우 기본값입니다.함수 생성명령은 그렇지 않습니다 카테고리를 지정하세요. 변동성 범주는 다음과 같은 약속입니다. 함수의 동작에 대한 최적화:

  • A 휘발성함수는 할 수 있습니다 데이터베이스 수정을 포함한 모든 것. 돌아올 수 있다 동일한 호출을 연속적으로 수행하면 다른 결과가 나타납니다. 인수. 옵티마이저는 어떤 가정도 하지 않습니다. 그러한 기능의 동작. 휘발성 함수를 사용한 쿼리 값이 있는 모든 행에서 함수를 다시 평가합니다. 필요합니다.

  • A 안정적함수는 수정할 수 없습니다 동일한 결과를 반환하도록 보장됩니다. 단일 내의 모든 행에 대해 동일한 인수가 주어지면 성명. 이 카테고리를 사용하면 최적화 프로그램이 최적화할 수 있습니다. 함수를 여러 번 호출하면 단일 호출이 됩니다. 에서 특히, 다음과 같은 표현을 사용하는 것이 안전합니다. 인덱스 스캔 조건에서 작동합니다. (인덱스 스캔 이후 비교 값은 한 번이 아니라 한 번만 평가됩니다. 각 행에서 a를 사용하는 것은 유효하지 않습니다.휘발성인덱스 스캔의 함수 조건.)

  • 불변함수는 할 수 없습니다 데이터베이스를 수정하고 동일한 결과를 반환하도록 보장됩니다. 동일한 인수가 영원히 주어지는 결과. 이 카테고리 옵티마이저는 다음과 같은 경우 함수를 사전 평가할 수 있습니다. 쿼리는 상수 인수를 사용하여 이를 호출합니다. 예를 들어 쿼리 좋아요선택 ... 어디서 x = 2 + 2할 수 있다 눈에 띄게 단순화되다선택 ... x = 4, 정수의 기본 함수가 덧셈 연산자가 표시됨불변.

최상의 최적화 결과를 얻으려면 함수에 라벨을 지정해야 합니다 유효한 가장 엄격한 변동성 범주를 사용합니다. 그들.

부작용이 있는 모든 토토 사이트 순위반드시라벨 지정휘발성, 이에 대한 호출이 최적화될 수 없습니다. 멀리. 부작용이 없는 토토 사이트 순위이라도 라벨을 붙여야 합니다.휘발성그 값이 다음 기간 내에 변경될 수 있는 경우 단일 쿼리; 몇 가지 예는 다음과 같습니다무작위(), currval(), timeofday().

또 다른 중요한 예는 다음과 같습니다.현재_타임스탬프함수 계열이 적합합니다. 와 같이안정적, 해당 값이 일치하지 않기 때문에 거래 내에서 변경됩니다.

상대적으로 차이가 거의 없습니다.안정적그리고불변간단한 대화형 쿼리를 고려할 때 카테고리 계획하고 즉시 실행: 성공 여부는 별로 중요하지 않습니다. 함수는 계획 중에 한 번 또는 쿼리 중에 한 번 실행됩니다. 실행 시작. 하지만 계획대로라면 큰 차이가 있습니다 저장하고 나중에 다시 사용하세요. 함수에 라벨 지정불변실제로는 그렇지 않을 때 허용될 수도 있습니다. 계획하는 동안 조기에 상수로 접혀서 계획의 후속 사용 중에 오래된 값이 재사용됩니다. 이는 준비된 문을 사용하거나 다음을 사용할 때 위험합니다. 계획을 캐시하는 함수 언어(예:PL/pgSQL).

SQL 또는 표준으로 작성된 함수의 경우 절차적 언어에는 두 번째로 중요한 속성이 있습니다. 변동성 범주, 즉 가시성에 따라 결정됩니다. SQL 명령으로 인해 발생한 모든 데이터 변경 사항 함수를 호출합니다. 갑휘발성함수는 그러한 변화를 보게 될 것입니다. a안정적또는불변토토 사이트 순위은 그렇지 않습니다. 이 동작은 MVCC의 스냅샷 동작을 사용하여 구현됩니다. (참조스포츠 토토 결과 : 문서 : 9.1 : 동시성 제어): 안정적그리고불변함수는 시작 시 설정된 스냅샷을 사용합니다. 쿼리를 호출하는 반면휘발성함수는 쿼리가 시작될 때마다 새로운 스냅샷을 얻습니다. 실행합니다.

참고:C로 작성된 함수는 스냅샷을 관리할 수 있습니다 하지만 일반적으로 C를 만드는 것이 좋습니다. 함수도 이런 식으로 작동합니다.

이 스냅샷 동작으로 인해 다음을 포함하는 함수가 만선택명령은 안전하게 수행될 수 있습니다. 표시됨안정적에서 선택하더라도 동시 수정이 진행 중인 테이블 쿼리.PostgreSQL실행됩니다 a의 모든 명령안정적함수 사용 호출 쿼리에 대해 설정된 스냅샷은 다음과 같습니다. 해당 쿼리 전반에 걸쳐 데이터베이스의 고정된 보기를 확인하세요.

동일한 스냅샷 동작이 사용됩니다.선택내 명령불변함수. 일반적으로 현명하지 못한 행동입니다 내의 데이터베이스 테이블에서 선택불변불변성 이후로 전혀 기능하지 않습니다. 테이블 내용이 변경되면 깨집니다. 그러나PostgreSQL그것을 시행하지 않습니다 넌 그러지 마.

일반적인 오류는 함수에 라벨을 붙이는 것입니다.불변결과가 다음에 따라 달라질 때 구성 매개변수. 예를 들어, 조작하는 함수 타임스탬프는 다음에 따라 결과가 나올 수 있습니다.시간대설정. 안전을 위해 이러한 토토 사이트 순위은 라벨로 표시되어야 합니다.안정적대신.

참고:이전PostgreSQL릴리스 8.0, 요구 사항 그안정적그리고불변함수는 데이터베이스를 수정할 수 없습니다 시스템에 의해 시행되지 않았습니다. 릴리스 8.0 이상 SQL 함수와 절차적 언어를 요구하여 이를 시행합니다. SQL 명령을 포함하지 않는 이러한 범주의 함수 이외선택. (이것은 이러한 토토 사이트 순위은 여전히 ​​완전히 방탄 테스트를 통과할 수 있기 때문에 전화휘발성수정하는 함수 데이터베이스. 그렇게 하면 다음과 같은 결과가 나올 것입니다.안정적또는불변함수는 다음을 인지하지 못합니다. 호출된 함수에 의해 적용된 데이터베이스 변경 사항은 스냅샷에서 숨겨집니다.)