IMMUTABLE, VOLATILE 및 STABLE 함수의 정의에서 진정한 의미에 대해 잘 모르겠습니다.
설명서, 특히 각각의 정의를 읽었습니다.
IMMUTABLE은 함수가 데이터베이스를 수정할 수 없으며 동일한 인수 값이 제공 될 때 항상 동일한 결과를 리턴 함을 나타냅니다 . 즉, 데이터베이스 조회를 수행하지 않거나 인수 목록에 직접 존재하지 않는 정보를 사용하지 않습니다. 이 옵션을 지정하면 모든 상수 인수가있는 함수 호출을 즉시 함수 값으로 바꿀 수 있습니다.
STABLE은 함수가 데이터베이스를 수정할 수 없으며 단일 테이블 스캔 에서 동일한 인수 값에 대해 동일한 결과를 일관되게 리턴 하지만 결과는 SQL 문에서 변경 될 수 있음을 나타냅니다. 이는 데이터베이스 조회, 매개 변수 (예 : 현재 시간대) 등에 따라 결과가 달라지는 함수에 적합한 선택입니다. (현재 명령으로 수정 된 행을 쿼리하려는 AFTER 트리거에는 적합하지 않습니다.) current_timestamp 함수 계열은 트랜잭션 내에서 값이 변경되지 않으므로 안정적인 것으로 간주됩니다.
VOLATILE은 단일 테이블 스캔에서도 함수 값이 변경 될 수 있으므로 최적화를 수행 할 수 없음을 나타냅니다. 이러한 의미에서 일시적인 데이터베이스 기능은 상대적으로 적습니다. 일부 예는 random (), currval (), timeofday ()입니다. 그러나 부작용이있는 기능은 결과가 상당히 예측 가능하더라도 호출이 최적화되지 않도록 휘발성으로 분류되어야합니다. 예는 setval ()입니다.
내 혼란은 불변에 대한 조건과 기능이 있음을 STABLE에 온다 항상 또는 지속적으로 같은 인수 주어진 동일한 결과를 반환합니다.
IMMUTABLE 정의는 함수가 데이터베이스 검색을 수행하지 않거나 인수 목록에 직접 존재하지 않는 정보를 사용함을 나타냅니다. 따라서 나에게 이것은 그러한 함수가 클라이언트가 제공 한 데이터를 조작하는 데 사용되며 SELECT 문이 없어야한다는 것을 의미합니다 ...하지만 조금 이상하게 들립니다.
STABLE을 사용하면 동일한 결과를 일관되게 반환해야한다는 정의가 비슷합니다. 즉, 함수가 동일한 인수로 호출 될 때마다 동일한 결과 (동일한 정확한 행, 매번)를 반환해야합니다.
따라서 나에게 ... 즉, 업데이트 할 수있는 테이블에서 SELECT를 수행하는 모든 함수는 일시적이어야합니다.
그러나 다시 ... 그게 나에게 들리지 않습니다.
이것을 다시 유스 케이스로 가져 오면 지속적으로 추가되는 테이블에서 여러 개의 JOIN이있는 SELECT 문을 수행하는 함수를 작성하므로 함수 호출은 동일한 인수로도 호출 될 때마다 다른 결과를 반환해야합니다 .
내 기능이 VOLATILE이어야한다는 것을 의미합니까? 비록 문서 가 이런 의미에서 휘발성이 적은 데이터베이스 기능을 거의 나타내지 않더라도 ?
감사합니다!