결과 캐시 무결성 (Result Cache Integrity) 설정

결과 캐시 무결성 (Result Cache Integrity) 이란?

결과 캐시는 데이터베이스에서 SQL 쿼리 또는 PL/SQL 함수의 결과를 메모리에 저장하여 동일한 요청이 발생할 때 빠르게 결과를 반환하는 기능입니다. RESULT_CACHE 힌트 또는 테이블 어노테이션을 사용하여 명시적으로 결과를 캐시하도록 지정할 수 있습니다. 하지만, 모든 쿼리나 함수가 캐시될 수 있는 것은 아니며, 캐시된 결과의 무결성을 보장하는 것이 중요합니다.

RESULT_CACHE_INTEGRITY 파라미터는 바로 이 무결성 문제를 제어합니다. 이 파라미터를 사용하면, 잠재적으로 결정적이지 않은 구문이나 PL/SQL 함수가 결과를 캐시하는 것을 방지할 수 있습니다. 이렇게 하면, 캐시된 결과가 항상 정확하고 일관성을 유지하도록 보장할 수 있습니다.

RESULT_CACHE_INTEGRITY 설정 방법

RESULT_CACHE_INTEGRITY 파라미터는 다음 세 가지 값 중 하나로 설정할 수 있습니다.

  • ENFORCED: PL/SQL 함수가 DETERMINISTIC으로 선언되지 않은 한, 쿼리 결과는 캐시될 수 없습니다. 이 설정은 가장 엄격하며, 최고 수준의 무결성을 보장합니다.
  • TRUSTED: PL/SQL 함수가 DETERMINISTIC으로 선언되었는지 여부에 관계없이 캐시될 수 있습니다. 이 설정은 개발자가 함수의 동작을 신뢰할 수 있다고 판단하는 경우에 사용됩니다.
  • ALL (기본값): 쿼리 결과는 캐시 무결성 확인을 건너뛰고 캐시될 수 있습니다. 이 설정은 가장 덜 엄격하며, 함수나 쿼리의 동작에 대한 어떠한 보장도 제공하지 않습니다.

파라미터는 ALTER SYSTEM 명령을 사용하여 시스템 레벨에서, 또는 ALTER SESSION 명령을 사용하여 세션 레벨에서 설정할 수 있습니다. 시스템 레벨 설정은 데이터베이스 인스턴스 전체에 적용되며, 세션 레벨 설정은 현재 세션에만 적용됩니다.

시스템 레벨 설정 예시:

ALTER SYSTEM SET RESULT_CACHE_INTEGRITY = ENFORCED SCOPE=SPFILE;

세션 레벨 설정 예시:

ALTER SESSION SET RESULT_CACHE_INTEGRITY = TRUSTED;

결정적 함수 (Deterministic Functions) 와 무결성

결정적 함수는 동일한 입력에 대해 항상 동일한 출력을 반환하는 함수입니다. PL/SQL에서 함수를 결정적으로 선언하려면 DETERMINISTIC 키워드를 사용합니다. 다음은 결정적 함수의 예시입니다.

CREATE OR REPLACE FUNCTION calculate_tax (p_price NUMBER, p_tax_rate NUMBER) 
  RETURN NUMBER DETERMINISTIC
AS
BEGIN
  RETURN p_price * p_tax_rate;
END;
/

RESULT_CACHE_INTEGRITY = ENFORCED로 설정된 경우, 결정적 함수만 결과 캐시에 저장될 수 있습니다. 개발자는 함수의 동작을 이해하고 신뢰할 수 있는 경우에만 DETERMINISTIC 키워드를 사용해야 합니다.

예제 및 시나리오

예제 1: 비결정적 함수 사용 제한

다음 함수는 현재 날짜를 사용하여 값을 반환하므로 결정적이지 않습니다:

CREATE OR REPLACE FUNCTION get_current_time
RETURN VARCHAR2 AS
BEGIN
  RETURN TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS');
END;
/

RESULT_CACHE_INTEGRITY = ENFORCED로 설정된 경우, 이 함수를 사용하는 쿼리는 결과를 캐시할 수 없습니다.

예제 2: 결정적 함수 사용

다음 함수는 입력 값을 기반으로 값을 반환하므로 결정적입니다:

CREATE OR REPLACE FUNCTION format_phone_number (p_phone NUMBER) 
RETURN VARCHAR2 DETERMINISTIC AS
BEGIN
  RETURN SUBSTR(p_phone, 1, 3) || '-' || SUBSTR(p_phone, 4, 3) || '-' || SUBSTR(p_phone, 7, 4);
END;
/

RESULT_CACHE_INTEGRITY = ENFORCED로 설정된 경우, 이 함수를 사용하는 쿼리는 결과를 캐시할 수 있습니다.

시나리오: 특정 세션에 대한 무결성 수준 완화

시스템의 기본 설정이 ENFORCED이지만, 특정 세션에서는 테스트 또는 특별한 목적을 위해 TRUSTED 모드를 사용할 수 있습니다. 다음 예제는 이를 보여줍니다.

-- 시스템 레벨 설정 확인
SHOW PARAMETER result_cache_integrity;

-- 세션 레벨 설정을 TRUSTED로 변경
ALTER SESSION SET RESULT_CACHE_INTEGRITY = TRUSTED;

-- 특정 쿼리 실행
SELECT /*+ result_cache */ format_phone_number(1234567890) FROM dual;

-- 세션 레벨 설정 원래대로 복원
ALTER SESSION SET RESULT_CACHE_INTEGRITY = ENFORCED;

고려 사항

  • 결정적 함수는 동일한 입력에 대해 항상 동일한 결과를 반환해야 합니다. 그렇지 않으면 결과 캐시의 무결성을 보장할 수 없습니다.
  • RESULT_CACHE_INTEGRITY 파라미터는 데이터베이스 성능에 영향을 줄 수 있습니다. 특히 ENFORCED로 설정하면, 모든 함수가 결정적인지 확인하는 과정에서 성능 오버헤드가 발생할 수 있습니다.
  • 개발자는 함수를 결정적으로 선언하기 전에 해당 함수의 동작을 신중하게 검토해야 합니다.

결론

결과 캐시를 사용할 때 RESULT_CACHE_INTEGRITY 파라미터를 적절히 설정하는 것은 매우 중요합니다. 무결성을 유지하면서 성능을 최적화하기 위해, 각 설정 옵션의 장단점을 이해하고 적절한 설정을 선택해야 합니다. DETERMINISTIC 함수를 신중하게 사용하여 결과 캐시가 필요한 성능 개선을 제공하면서도 데이터의 정확성을 보장해야 합니다.

위로 스크롤