클라이언트 결과 캐시 개요
오라클 데이터베이스의 클라이언트 결과 캐시는 애플리케이션 성능을 향상시키기 위해 클라이언트 측(OCI, JDBC 등)에 쿼리 결과를 캐싱하는 기능입니다. 이를 통해 반복적인 쿼리에 대한 데이터베이스 왕복 횟수를 줄이고, 응답 시간을 단축할 수 있습니다.
클라이언트 결과 캐시에서 캐시되지 않는 쿼리
모든 쿼리가 클라이언트 결과 캐시에 캐싱될 수 있는 것은 아닙니다. 다음과 같은 유형의 쿼리는 클라이언트 결과 캐시에서 캐싱되지 않습니다.
1. 원격 객체 참조 쿼리
쿼리가 데이터베이스 링크를 통해 원격 객체를 참조하는 경우 클라이언트 결과 캐시는 해당 쿼리를 캐싱할 수 없습니다. 이는 원격 데이터의 일관성을 유지하기 어렵기 때문입니다.
SELECT * FROM employees@remote_db WHERE salary > 5000;
2. 복잡한 유형을 포함하는 쿼리
쿼리가 복잡한 유형(예: 객체 유형, PL/SQL 함수)을 포함하는 경우 클라이언트 결과 캐시는 해당 쿼리를 캐싱할 수 없습니다. 복잡한 유형은 직렬화 및 역직렬화 과정에서 추가적인 overhead를 발생시키고, 데이터 일관성을 보장하기 어렵게 만들 수 있습니다.
CREATE TYPE address_t AS OBJECT (
street VARCHAR2(100),
city VARCHAR2(50)
);
SELECT e.employee_id, e.name, a.street, a.city
FROM employees e, TABLE(e.addresses) a;
3. 스냅샷 쿼리
스냅샷을 사용하는 쿼리는 클라이언트 결과 캐시에서 캐싱할 수 없습니다. 스냅샷은 특정 시점의 데이터 스냅샷을 제공하며, 데이터가 변경될 때 자동으로 갱신되지 않습니다.
CREATE MATERIALIZED VIEW log_summary
REFRESH COMPLETE START WITH SYSDATE NEXT SYSDATE + 1
AS
SELECT log_date, COUNT(*) FROM logs GROUP BY log_date;
4. 직렬화 가능한 읽기 전용 트랜잭션 쿼리 (Serializable Read-Only Transactions)
격리 수준이 SERIALIZABLE
로 설정된 읽기 전용 트랜잭션에서 실행되는 쿼리는 클라이언트 결과 캐시에 캐싱할 수 없습니다. 이러한 트랜잭션은 데이터베이스 일관성을 위해 추가적인 잠금 메커니즘을 사용하기 때문에 캐싱이 적합하지 않습니다.
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE READ ONLY;
SELECT * FROM employees WHERE department_id = 10;
COMMIT;
5. 사용자 정의 PL/SQL 함수를 사용하는 쿼리
SQL 문에서 사용자 정의 PL/SQL 함수를 호출하면 클라이언트 결과 캐시는 이 쿼리를 캐싱하지 못할 수 있습니다. 이는 함수 결과가 SQL 실행마다 변경될 수 있기 때문입니다.
CREATE FUNCTION get_salary_band (emp_id IN NUMBER) RETURN VARCHAR2 AS band VARCHAR2(50); BEGIN SELECT salary_band INTO band FROM salary_bands WHERE employee_id = emp_id; RETURN band; END; SELECT employee_id, get_salary_band(employee_id) FROM employees;
6. 힌트를 사용하여 명시적으로 캐싱을 비활성화한 쿼리
쿼리에 /*+ NO_RESULT_CACHE */
힌트가 포함된 경우, 클라이언트 결과 캐시를 명시적으로 사용하지 않도록 지시합니다.
SELECT /*+ NO_RESULT_CACHE */ employee_id, name FROM employees WHERE department_id = 20;
7. 가상 개인 데이터베이스(VPD) 정책이 활성화된 테이블에 대한 쿼리
VPD 정책이 활성화된 테이블에 대한 쿼리의 경우 보안상의 이유로 결과 캐싱이 제한될 수 있습니다. 모든 세션에서 동일한 결과를 보장할 수 없기 때문입니다.
8. 결과 집합이 너무 큰 쿼리
결과 집합의 크기가 클라이언트 측 캐시 제한을 초과하는 쿼리는 캐싱되지 않습니다. 캐시 공간이 부족하면 성능 저하가 발생할 수 있기 때문입니다.
결론
클라이언트 결과 캐시는 반복적인 쿼리에 대한 성능을 크게 향상시킬 수 있지만, 모든 쿼리가 캐싱될 수 있는 것은 아닙니다. 위에 제시된 예외 사항들을 고려하여 애플리케이션을 설계하고 쿼리 성능을 최적화하는 것이 중요합니다. 특히, 데이터의 일관성과 보안이 중요한 환경에서는 클라이언트 결과 캐시 사용에 신중해야 합니다.