메뉴 건너뛰기

bysql.net

7. 세션 커서 캐싱

2010.06.29 12:32

토시리 조회 수:10619

SQL수행에 따른 퍼포먼스 저하.


소프트파싱. 즉, 파싱된 SQL구문을 또 다시 분석하지 말고, 공유함으로 하드파싱의 횟수를 낮춰서 효율을 올릴수 있다.
쿼리수행후엔 커서를 닫고, 그로인해 세션커서가 할당받은 메모리 및 해당포인터는 해제된다.
커서 오픈을 위한작업, library cache래치를 획득하여 라이브러리 캐시를 탐색하는 등의 작업이 발생하며, 이것은 부담스러운 작업이다..

결국, 소프트파싱을 한다해도, SQL수행횟수가 많아지면 경합이 발생하게 된다.

좀 더 부하를 줄이기 위해서는(③작업도 최소화하려면), 소프트파싱 이외에도 세션커서를 공유해야 한다..


오라클은 세션커서캐싱이라는 기능을 제공하여 를 실현한다.


세션커서를 공유함으로 해서 다음과 같은 잇점이 있다.

●SQL문을 파싱, 구문분석하고 라이브러리 캐시에서 커서를 탐색하는 과정 감소. (CPU사용량감소)

소프트 파싱 과정에서 발생하는 래치요청횟수를 감소.


커서를 닫는 순간(②). Parse Call횟수를 확인하여 3이 상이면 ”자주사용”으로 간주 해당 세션커서를 세션커서캐시로 옮긴다.

※세션커서캐시 내에서는, LRU 알고리즘을 이용, 사용빈도가 낮은 순으로 밀려난다.


session_cached_cursors  캐싱할 커서의 갯수. 0보다 큰값을 설정하면 Parse Call이 발생할때마다 세션커서캐시를 먼저살펴봄.

users_opening (v$sql항목)  공유커서를 참조하고 있는 세션커서의 수.

users_executing (v$sql항목)  해당 SQL을 현재 실행 중인, 즉 커서가 열려있는 세션커서의 수를 보여준다.


실습 1)

01.JPG


02.JPG


03.JPG


04.JPG


같은 SQL을 3번실행시켜보면, 3번째(Parse_Calls=3) 비로소 ?該커서가 공유커서를 참조(USERS_OPENING=1)하게 되는것을 볼 수 있다.


session cursor cache hits항목을 통해 이 기능의 활용 빈도를 측정할 수 있다.


실습 2)

session_cached_cursors 파라메타를 0으로 설정하고 INSERT문을 10000번 실행시켜본다.

이때의 session cursor cache hitsparse count의 변화를 관찰해보자.05.JPG

06.JPG


07.JPG


session cursor cache hits는 변화가 없고, parse count는 10000가량 늘은것을 알수있다.


실습 3)

session_cached_cursors 파라메타를 100으로 설정하고 INSERT문을 10000번 실행시켜본다.

이때의 session cursor cache hitsparse count의 변화를 관찰해보자.

08.JPG


09.JPG


insert문이 10000번 수행되는 동안, parse count와 함께 session cursor cache hits도 10000번가까이 증가했음을 알수 있다.