본문 바로가기

Oracle

latch: shared pool


select * from v$session_event where wait_class# in (2,4) order by Total_Waits desc --event like '%latch%' 
 
select wait_class, count(*), sum(total_waits), sum(time_waited) from v$session_event group by wait_class order by sum(total_waits) desc

select wait_class, Event, count(*), sum(total_waits), sum(time_waited) from v$session_event group by wait_class, Event order by sum(total_waits) desc

select * from v$session_event Where event like '%latch: shared pool%' 
 

SQL> conn /as sysdba
Connected.
SQL> show sga

Total System Global Area 2164260864 bytes
Fixed Size                  2085464 bytes
Variable Size            1090522536 bytes  -- Shared Pool Size
Database Buffers         1056964608 bytes
Redo Buffers               14688256 bytes
SQL>

shared pool 래치는 Shared Pool 의 기본 메모리 구조인 힙을 보호하는 역할을 한다.
Free Chunk 를 찾기위해 프리리스트를 탐색하고, 적절한 청크를 할당하고, 필요한 경우 프리청크를 분할(Split)하는 일련의 작업들은 모두 shared pool 래치를 획득한 후에만 가능하다.
shared pool 래치를 획득하는 과정에서 경합이 발생하면 latch:shared pool 이벤트를 대기한다.

 
shared pool 래치는 기본적으로 전체 인스턴스에 하나만이 존재한다. 즉 하나의 Shared Pool 에 하나의 Shared Pool 래치가 사용된다. 이것은 Shared Pool 의 기본 메모리 구조인 힙의 아키텍처에 기인하는 것이다.
따라서 동시에 여러 세션이 청크를 할당받아야 하는 경우 하나의  shared pool 래치를 획득하기 위해 경쟁하기 때문에 경합이 발생하게 된다.

하드파싱이 발생하면 새로운 SQL 정보를 담을 Chunk를 할당받기 위해 FreeList 를 탐색해야 한다. 이러한 일련의 행위동안 오직 하나의 프로세스만이  Shared Pool Latch 를 독점해야하기 때문에
동시에 많은 세션이 하드파싱을 수행하는  경우 latch:shared pool 대기가 많이 발생하게 된다.

오라클 9i 이상부터는  Shared Pool 을 여러개의 서브풀로 최대 7개까지 나누어서 관리할 수 있다.  MKGHDSIDX_COUNT  히든 파라미터를 이용하면 서브풀의 개수를 관리할 수 있다. 
오라클은 CPU 개수가 4 이상이고, Shared Pool 의 크기가 250M 이상인 경우 _KGHDSIDX_COUNT 의 값만큼 서브풀을 생성해서  Shared Pool 을 관리한다.
서브풀은 그 자체가 독립적인 Shared Pool 로 관리되며 독자적인  FreeList, LRU List, Shared Pool Latch 를 가진다.
따라서 Shared Pool 의 크기가 큰 경우에는 서브풀로 쪼개서 관리함으로써 Shared Pool 의 래치 경합을 줄일 수 있다.
 


SQL> Show parameter cpu_count

NAME                                 TYPE        VALUE
------------------------------------ ----------- -----------
cpu_count                            integer     4
SQL>


select * from v$latch_children where name = 'shared pool'

Reference : Library Cache 에서의 대기 이벤트들  책 :  Advanced OWI in oracle 10g  p217 ~


'Oracle' 카테고리의 다른 글

Expert Oracle Database Architecture (written by Tom )  (0) 2011.07.28
SYS.DBMS_JOB.SUBMIT( , , , , )  (0) 2011.07.27
PL/SQL Block 에서 DDL 사용하기  (0) 2011.07.20
Oracle/PLSQL: Dump Function  (0) 2011.07.19
V$SQL  (0) 2011.07.18