SQL) 라이브러리 캐시 최적화 원리 Ⅲ

jinsung·2025년 12월 10일

SQL

목록 보기
21/46
post-thumbnail

7. 세션 커서 캐싱

세션 커서 캐싱이란?

오라클은 자주 수행하는 SQL에 대해서 세션 커서를 세션 커서 캐시에 저장할 수 있는 기능을 제공하는데, 이를 '세션 커서 캐싱' 이라고 한다.
이 기능을 활성화하면, 커서를 닫는 순간 해당 커서의 Parse Call 횟수를 보고 그 값이 3보다 크거나 같으면 세션 커서를 세션 커서 캐시로 옮긴다. 세션 커서 캐시는 SQL 텍스트와 함께 공유 커서를 가리키는 포인터를 저장한다.
커서는 닫힌 상태지만 공유 커서에 대한 참조는 유지하기 때문에 다음 수행 시 더 빨리 커서를 오픈할 수 있다. 따라서 자주 수행되는 SQL문에 의해 발생하는 라이브러리 캐시 부하를 경감시킬 수 있다.
즉, SQL문을 파싱해서 구문을 분석하고 라이브러리 캐시에서 커서를 찾는 과정에서 소모되는 CPU 사용량을 줄일 수 있음은 물론, 소프트 파싱 과정에 발생하는 래치 요청 횟수를 감소시키는 효과를 가져온다. 세션 커서도 LRU 알고리즘을 사용함으로 새로운 엔트리를 위한 공간이 필요할 때마다 기존 세션 커서 중 사용 빈도가 낮은것부터 밀어낸다.


세션 커서 캐싱 파라미터

session_cached_cursors

얼마나 많은 세션 커서를 캐싱할지 지정하는 파라미터 (0보다 커야 커서 캐싱)

v$sql의 컬럼들

users_opening

공유 커서를 참조하고 있는 세션 커서의 수
커서를 닫았더라도 공유 커서를 참조하고 있을 때는 계수된다

users_executing

해당 SQL을 현재 실행 중인, 즉 커서가 열려있는 세션 커서의 수


PL/SQL에서는 SQL 커서를 자동으로 캐싱해 주는데, 10g 부터는 이 기능이 session_cached_cursors 파라미터를 0보다 크게 설정할 때만 작동한다.
따라서, 10g 이후 버전에서는 세션 커서 캐싱 기능을 반드시 활성화해야 한다.
세션 커서 캐싱 기능은 Parse Call을 대체하기보다 Parse Call의 부하를 감소시키는 기능이다.


8. 애플리케이션 커서 캐싱

애플리케이션 커서 캐싱이란?

세션 커서를 캐싱하면 SGA의 공유 커서를 빠르게 찾아서 커서를 오픈할 수 있다. 하지만 세션 커서 캐시에 있는 SQL을 수행하더라도 공유 캐시 힙을 Pin하고 실행에 필요한 메모리 공간을 PGA에 할당하는 등의 작업은 반복하게 된다.
이 과정마저 생략하고 빠르게 SQL을 수행하는 방법이 있는데, 이를 '애플리케이션 커서 캐싱' 이라고 한다.

애플리케이션 커서 캐싱 기능을 사용하면 공유 커서를 Pin한 채 반복 수행하므로 Parse Call이 최초 한 번만 발생하고 그 이후에는 발생하지 않는다.
Java에서 이 기능을 구현하려면 묵시적 캐싱 옵션을 사용하거나 Statement를 닫지 않고 재사용하면 된다.


Java, 패턴별 수행속도 비교

패턴 1 : 바인드 변수를 사용하지 않을 때

바인드 변수를 사용하지 않았으므로 매번 하드 파싱을 반복 수행하게 된다.

패턴 2: 바인드 변수를 사용하지만, 커서를 캐싱하지 않을 때

바인드 변수를 사용하므로 하드 파싱이 한번만 발생하거나 아예 발생하지 않고,
커서를 캐싱하지 않아서 Parse Call 횟수가 Execute Call 횟수만큼 발생한다.

패턴 3: 커서를 닫지 않고 재사용할 때(커서 캐싱)

Java PreparedStatement 객체인 애플리케이션 커서를 루프문 바깥에 선언하고, 루프가 다 끝나고 커서를 닫았다.
Parse Call은 단 한번만 발생한다.

패턴 4 : 묵시적 캐싱 기능을 사용할 때

캐시 사이즈를 1로 지정하고 묵시적 캐시 기능을 활성화했다.
Java PreparedStatement 객체를 루프문 안쪽에 선언하고 루프내 쿼리를 실행하자마자 커서를 곧바로 닫았다.
루프 내에서 커서를 매번 닫았지만 Parse Call은 단 한번만 발생했다.
-> 묵시적 캐시 기능을 활성화했기 때문에


PL/SQL에서는 Static SQL을 사용하면 자동적으로 커서를 캐싱한다.
Dynamic SQL을 사용하거나 Cursor Variable을 사용할 때는 커서를 자동으로 캐싱하는 효과가 사라진다.
10g 이후부터 같은 SQL을 연속적으로 실행하면, Dynamic SQL이더라도 바로 직전 커서를 캐싱한다. 이것 모두 session_cached_cursors 파라미터가 0보다 클 때만 작동한다.

profile
Backend Engineer

0개의 댓글