36.7. 토토 베이 변동성 카테고리#

모든 함수에는 다음이 있습니다.변동성분류, 가능성은 다음과 같습니다휘발성, 안정적, 또는불변. 휘발성다음의 경우 기본값입니다.토토 베이 생성명령은 카테고리를 지정하지 않습니다. 변동성 카테고리는 함수의 동작에 관해 최적화 프로그램에 대한 약속입니다.

  • A 휘발성함수는 데이터베이스 수정을 포함하여 무엇이든 할 수 있습니다. 동일한 인수를 사용하여 연속 호출 시 다른 결과를 반환할 수 있습니다. 옵티마이저는 그러한 함수의 동작에 대해 어떠한 가정도 하지 않습니다. 휘발성 함수를 사용하는 쿼리는 해당 값이 필요한 모든 행에서 함수를 다시 평가합니다.

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

  • 불변함수는 데이터베이스를 수정할 수 없으며 동일한 인수가 주어지면 영원히 동일한 결과를 반환하도록 보장됩니다. 이 범주를 사용하면 쿼리가 상수 인수를 사용하여 함수를 호출할 때 최적화 프로그램이 함수를 사전 평가할 수 있습니다. 예를 들어, 다음과 같은 쿼리는선택 ... WHERE x = 2 + 2눈에 보이는 대로 단순화될 수 있음선택 ... WHERE x = 4, 정수 덧셈 연산자의 기본 토토 베이가 표시되어 있기 때문입니다.불변.

최상의 최적화 결과를 얻으려면 함수에 유효한 가장 엄격한 변동성 카테고리로 함수에 라벨을 지정해야 합니다.

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

또 다른 중요한 예는 다음과 같습니다.현재_타임스탬프함수 계열은 다음과 같습니다.안정적, 해당 값은 트랜잭션 내에서 변경되지 않기 때문입니다.

상대적으로 차이가 거의 없습니다.안정적그리고불변계획되고 즉시 실행되는 간단한 대화형 쿼리를 고려할 때 범주: 함수가 계획 중에 한 번 실행되는지, 쿼리 실행 시작 중에 한 번 실행되는지는 크게 중요하지 않습니다. 하지만 계획을 저장했다가 나중에 재사용한다면 큰 차이가 있습니다. 함수에 라벨 지정불변실제로는 그렇지 않은 경우 계획 중에 조기에 상수로 접힐 수 있으며 결과적으로 계획의 후속 사용 중에 오래된 값이 재사용될 수 있습니다. 이는 준비된 문을 사용하거나 계획을 캐시하는 토토 베이 언어(예:PL/pgSQL).

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

참고

C로 작성된 토토 베이는 원하는 대로 스냅샷을 관리할 수 있지만 일반적으로 C 토토 베이도 이런 방식으로 작동하도록 만드는 것이 좋습니다.

이 스냅샷 동작으로 인해 다음을 포함하는 함수는선택명령은 안전하게 표시될 수 있습니다.안정적, 동시 쿼리에 의해 수정이 진행 중인 테이블에서 선택하는 경우에도 마찬가지입니다.PostgreSQLa의 모든 명령을 실행합니다안정적토토 베이는 호출 쿼리에 대해 설정된 스냅샷을 사용하므로 해당 쿼리 전반에 걸쳐 데이터베이스의 고정된 보기를 볼 수 있습니다.

동일한 스냅샷 동작이 사용됩니다.선택내 명령불변함수. 일반적으로 내의 데이터베이스 테이블에서 선택하는 것은 현명하지 않습니다.불변함수를 전혀 사용하지 마세요. 테이블 내용이 변경되면 불변성이 깨질 수 있기 때문입니다. 그러나PostgreSQL당신이 그렇게 하지 않도록 강요하지 않습니다.

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

참고

PostgreSQL다음이 필요합니다안정적그리고불변함수에는 다음 이외의 SQL 명령이 포함되어 있지 않습니다.선택데이터 수정을 방지합니다. (이러한 토토 베이는 여전히 호출될 수 있으므로 완전히 방탄 테스트는 아닙니다.휘발성데이터베이스를 수정하는 함수. 그렇게 하면 다음과 같은 결과가 나올 것입니다.안정적또는불변토토 베이는 호출된 토토 베이에 의해 적용된 데이터베이스 변경 사항을 인식하지 못합니다. 왜냐하면 해당 변경 사항은 스냅샷에 숨겨져 있기 때문입니다.)

수정사항 제출

문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식문서 문제를 보고합니다.