개요
오라클 데이터베이스는 쿼리 성능을 향상시키기 위해 서버 결과 캐시(Server Result Cache) 및 클라이언트 결과 캐시(Client Result Cache)와 같은 다양한 캐싱 메커니즘을 제공합니다. 이 중에서도 특히 세션 레벨에서 결과 캐시를 제어하는 것은 특정 애플리케이션 요구 사항 및 성능 목표에 맞게 데이터베이스 동작을 맞춤 설정하는 데 매우 유용합니다.
결과 캐시란 무엇인가?
결과 캐시는 데이터베이스 쿼리나 PL/SQL 함수의 결과를 메모리에 저장하여 동일한 쿼리나 함수가 반복적으로 실행될 때 디스크 I/O를 최소화하고 응답 시간을 단축하는 기술입니다. 결과 캐시는 크게 서버 측과 클라이언트 측으로 나뉘며, 서버 결과 캐시는 SGA(System Global Area) 내에 위치하여 여러 세션에서 공유할 수 있습니다. 반면 클라이언트 결과 캐시는 OCI(Oracle Call Interface) 기반 애플리케이션에서 사용되며, 클라이언트 측 메모리 영역에 결과를 저장합니다.
세션 레벨 결과 캐시 제어의 중요성
세션 레벨에서 결과 캐시를 제어하면 다음과 같은 이점을 얻을 수 있습니다:
- 유연성: 각 세션의 특정 요구 사항에 따라 캐싱 동작을 조정할 수 있습니다. 예를 들어, 읽기 전용(Read-Only) 테이블에 대한 쿼리 결과를 캐싱하고, 변경이 잦은 테이블에 대한 쿼리는 캐싱하지 않도록 설정할 수 있습니다.
- 성능 향상: 특정 세션에서 자주 실행되는 쿼리 결과를 캐싱하여 응답 시간을 단축하고, 전체 시스템 성능을 향상시킬 수 있습니다.
- 자원 관리: 캐시 크기 및 무효화 정책을 세션 레벨에서 제어하여 SGA와 같은 데이터베이스 자원을 효율적으로 관리할 수 있습니다.
세션 레벨 결과 캐시 제어 방법
오라클 데이터베이스에서는 RESULT_CACHE_MODE
세션 파라미터를 사용하여 결과 캐시 동작을 제어할 수 있습니다. 이 파라미터는 다음과 같은 값을 가질 수 있습니다:
- MANUAL: 쿼리 또는 테이블 힌트를 사용하여 결과 캐시를 명시적으로 활성화합니다.
- FORCE: 쿼리나 테이블 힌트와 상관없이 모든 쿼리에 대해 결과 캐시를 강제로 활성화합니다.
- DEFAULT: 서버 파라미터 파일에 설정된 기본 결과 캐시 모드를 따릅니다. 일반적으로 이 모드는 MANUAL 모드와 동일하게 작동합니다.
세션 레벨에서 RESULT_CACHE_MODE
파라미터를 변경하려면 ALTER SESSION
명령어를 사용합니다. 예를 들어, 현재 세션에서 결과 캐시를 강제로 활성화하려면 다음과 같이 실행합니다:
ALTER SESSION SET RESULT_CACHE_MODE = FORCE;
반대로 결과 캐시를 수동 모드로 설정하려면 다음과 같이 실행합니다:
ALTER SESSION SET RESULT_CACHE_MODE = MANUAL;
실무 적용 예시
다음은 실무에서 세션 레벨 결과 캐시 제어를 사용하는 몇 가지 예시입니다:
1. 배치 작업 성능 향상
매일 밤 실행되는 배치 작업에서 특정 테이블에 대한 통계 쿼리를 반복적으로 수행해야 하는 경우, 해당 세션에서 결과 캐시를 강제로 활성화하여 쿼리 응답 시간을 단축할 수 있습니다.
-- 배치 작업 시작 전에 실행ALTER SESSION SET RESULT_CACHE_MODE = FORCE;-- 통계 쿼리 수행SELECT COUNT(*) FROM orders WHERE order_date = TRUNC(SYSDATE);-- 배치 작업 완료 후 실행ALTER SESSION SET RESULT_CACHE_MODE = DEFAULT;
2. 읽기 전용 애플리케이션 성능 최적화
웹 기반 보고서 애플리케이션과 같이 데이터 변경이 거의 없는 읽기 전용 애플리케이션의 경우, 모든 쿼리에 대해 결과 캐시를 강제로 활성화하여 응답 시간을 획기적으로 줄일 수 있습니다.
-- 애플리케이션 연결 시 실행ALTER SESSION SET RESULT_CACHE_MODE = FORCE;-- 쿼리 수행SELECT product_name, category FROM products;-- 애플리케이션 연결 종료 시 실행ALTER SESSION SET RESULT_CACHE_MODE = DEFAULT;
3. 특정 테이블에 대한 캐싱 제어
특정 테이블에 대해 캐싱을 활성화하거나 비활성화하려면 RESULT_CACHE
힌트를 사용할 수 있습니다. 다음은 orders
테이블에 대해 결과 캐싱을 활성화하는 예시입니다:
SELECT /*+ RESULT_CACHE */ order_id, customer_id FROM orders WHERE order_date BETWEEN SYSDATE - 7 AND SYSDATE;
반대로 orders
테이블에 대해 결과 캐싱을 비활성화하려면 다음과 같이 NO_RESULT_CACHE
힌트를 사용합니다:
SELECT /*+ NO_RESULT_CACHE */ order_id, customer_id FROM orders WHERE order_date BETWEEN SYSDATE - 7 AND SYSDATE;
4. PL/SQL 함수 결과 캐싱
PL/SQL 함수 결과를 캐싱하려면 RESULT_CACHE
절을 사용하여 함수를 정의합니다. 다음은 특정 고객의 총 주문 금액을 반환하는 함수의 예시입니다:
CREATE OR REPLACE FUNCTION get_customer_total (p_customer_id NUMBER) RETURN NUMBER RESULT_CACHE ASBEGIN DECLARE v_total NUMBER; BEGIN SELECT SUM(order_total) INTO v_total FROM orders WHERE customer_id = p_customer_id; RETURN v_total; END;END;/
이 함수는 RESULT_CACHE
절을 포함하므로, 입력 매개변수 p_customer_id
에 대해 이미 계산된 결과가 있는 경우 메모리에서 결과를 반환합니다.
주의사항
결과 캐시를 사용할 때는 다음 사항에 유의해야 합니다:
- 데이터 일관성: 캐시된 데이터가 최신 상태인지 확인해야 합니다. 데이터 변경 시 캐시를 무효화하거나, 적절한 만료 정책을 설정해야 합니다.
- 자원 소모: 결과 캐시는 메모리를 사용하므로, 캐시 크기를 적절하게 관리해야 합니다. 너무 큰 캐시는 SGA 부족을 야기할 수 있습니다.
- 복잡한 쿼리: 복잡한 쿼리나 DML 작업이 포함된 쿼리는 결과 캐싱에 적합하지 않을 수 있습니다.
결론
세션 레벨에서 오라클 결과 캐시를 제어하면 애플리케이션 성능을 최적화하고 데이터베이스 자원을 효율적으로 관리할 수 있습니다. 다양한 설정 옵션과 힌트를 활용하여 특정 요구 사항에 맞는 캐싱 전략을 구현할 수 있습니다.