모든 함수에는 다음이 있습니다.변동성분류, 가능성은 다음과 같습니다휘발성, 안정적또는불변. 휘발성다음의 경우 기본값입니다윈 토토 생성명령은 카테고리를 지정하지 않습니다. 변동성 카테고리는 함수의 동작에 관해 최적화 프로그램에 대한 약속입니다.
A 휘발성함수는 데이터베이스 수정을 포함하여 무엇이든 할 수 있습니다. 동일한 인수를 사용하여 연속 호출 시 다른 결과를 반환할 수 있습니다. 옵티마이저는 그러한 함수의 동작에 대해 어떠한 가정도 하지 않습니다. 휘발성 함수를 사용하는 쿼리는 해당 값이 필요한 모든 행에서 함수를 다시 평가합니다.
A 안정적윈 토토는 데이터베이스를 수정할 수 없으며 단일 명령문 내의 모든 행에 대해 동일한 인수가 주어지면 동일한 결과를 반환하도록 보장됩니다. 이 범주를 사용하면 최적화 프로그램이 윈 토토의 여러 호출을 단일 호출로 최적화할 수 있습니다. 특히, 인덱스 스캔 조건에서는 이러한 윈 토토를 포함하는 표현식을 사용하는 것이 안전합니다. (인덱스 스캔은 각 행에서 한 번이 아닌 한 번만 비교 값을 평가하므로 a를 사용하는 것은 유효하지 않습니다.휘발성인덱스 스캔 조건에서 윈 토토합니다.)
안불변함수는 데이터베이스를 수정할 수 없으며 동일한 인수가 주어지면 영원히 동일한 결과를 반환하도록 보장됩니다. 이 범주를 사용하면 쿼리가 상수 인수를 사용하여 함수를 호출할 때 최적화 프로그램이 함수를 사전 평가할 수 있습니다. 예를 들어, 다음과 같은 쿼리는선택 ... WHERE x = 2 + 2눈에 보이는 대로 단순화될 수 있음선택 ... 어디서 x = 4, 정수 덧셈 연산자의 기본 윈 토토가 표시되어 있기 때문입니다.불변.
최상의 최적화 결과를 얻으려면 함수에 유효한 가장 엄격한 변동성 카테고리로 함수에 라벨을 지정해야 합니다.
부작용이 있는 모든 윈 토토반드시라벨이 지정됨휘발성, 이에 대한 호출이 최적화될 수 없습니다. 부작용이 없는 윈 토토이라도 라벨을 붙여야 합니다.휘발성단일 쿼리 내에서 해당 값이 변경될 수 있는 경우; 몇 가지 예는 다음과 같습니다무작위(), currval(), timeofday().
또 다른 중요한 예는 다음과 같습니다.현재_타임스탬프함수 계열은 다음과 같습니다.안정적, 해당 값은 트랜잭션 내에서 변경되지 않기 때문입니다.
상대적으로 차이가 거의 없습니다.안정적그리고불변계획되고 즉시 실행되는 간단한 대화형 쿼리를 고려할 때 범주: 윈 토토가 계획 중에 한 번 실행되는지, 쿼리 실행 시작 중에 한 번 실행되는지는 크게 중요하지 않습니다. 하지만 계획을 저장했다가 나중에 재사용한다면 큰 차이가 있습니다. 윈 토토에 라벨 지정불변실제로는 그렇지 않은 경우 계획 중에 조기에 상수로 접힐 수 있으며 결과적으로 계획의 후속 사용 중에 오래된 값이 재사용될 수 있습니다. 이는 준비된 문을 사용하거나 계획을 캐시하는 윈 토토 언어(예:PL/pgSQL).
SQL 또는 표준 절차 언어로 작성된 함수의 경우 변동성 범주에 따라 결정되는 두 번째 중요한 속성이 있습니다. 즉, 함수를 호출하는 SQL 명령에 의해 발생한 모든 데이터 변경 사항의 가시성입니다. 갑휘발성윈 토토는 그러한 변화를 보게 될 것입니다. a안정적또는불변윈 토토은 그렇지 않습니다. 이 동작은 MVCC의 스냅샷 동작을 사용하여 구현됩니다(참조사설 토토 : 문서 : 12 : 13 장. 동시성 제어): 안정적그리고불변윈 토토는 호출 쿼리 시작 시 설정된 스냅샷을 사용하는 반면휘발성윈 토토는 실행하는 각 쿼리가 시작될 때 새로운 스냅샷을 얻습니다.
C로 작성된 윈 토토는 원하는 대로 스냅샷을 관리할 수 있지만 일반적으로 C 윈 토토도 이런 방식으로 작동하도록 만드는 것이 좋습니다.
이 스냅샷 동작으로 인해 다음을 포함하는 함수는선택명령은 안전하게 표시될 수 있습니다안정적, 동시 쿼리에 의해 수정이 진행 중인 테이블에서 선택하는 경우에도 마찬가지입니다.PostgreSQLa의 모든 명령을 실행합니다안정적윈 토토는 호출 쿼리에 대해 설정된 스냅샷을 사용하므로 해당 쿼리 전반에 걸쳐 데이터베이스의 고정된 보기를 볼 수 있습니다.
동일한 스냅샷 동작이 사용됩니다.선택내 명령불변함수. 일반적으로 내의 데이터베이스 테이블에서 선택하는 것은 현명하지 않습니다.불변함수를 전혀 사용하지 마세요. 테이블 내용이 변경되면 불변성이 깨질 수 있기 때문입니다. 그러나PostgreSQL당신이 그렇게 하지 않도록 강요하지 않습니다.
일반적인 오류는 윈 토토에 라벨을 붙이는 것입니다.불변결과가 구성 매개변수에 따라 달라지는 경우. 예를 들어 타임스탬프를 조작하는 함수는 다음에 따라 결과가 나올 수 있습니다.시간대설정. 안전을 위해 이러한 윈 토토은 라벨로 표시되어야 합니다.안정적대신.
PostgreSQL다음이 필요합니다안정적그리고불변함수에는 다음 이외의 SQL 명령이 포함되어 있지 않습니다.선택데이터 수정을 방지합니다. (이러한 윈 토토는 여전히 호출될 수 있으므로 완전히 방탄 테스트는 아닙니다.휘발성데이터베이스를 수정하는 함수. 그렇게 하면 다음과 같은 결과가 나올 것입니다.안정적또는불변윈 토토는 호출된 윈 토토에 의해 적용된 데이터베이스 변경 사항을 인식하지 못합니다. 왜냐하면 해당 변경 사항은 스냅샷에 숨겨져 있기 때문입니다.)