본문 바로가기

---- Book Cafe ----/Expert Oracle Practices

래치 (Latch)


래치는 오라클 데이터베이스의 주요 구조에 대한 변경 작업을 직렬화 하기 위해 사용되는 메커니즘이다.  
래치는 여러개의 세션이 SGA 내의 주요 리소스를 동시에 변경하는 일이 발생하지 않도록 보호하는 직렬화 메커니즘이다. 세션이 SGA 내의 특정 영역을 조회하거나 변경하기 위해서는, 관련 래치부터 먼저 획득해야 한다.

래치는 엔큐(enqueue :  락이라고도 불림) 와는 매우 다른 속성을 가지고 있다.
엔큐는 특정 테이블이나 로우를 대상으로 상충되는 오퍼레이션이 동시에 발생하지 않도록 하기 위해 오브젝트 또는 로우를 잠그는 역할을 하며 세션들은 총 6 개의 모드로 리소스에 락을 걸 수 있다.
반면에, 래치는 공유모드와 배타적 모드만 존재한다.

또한 엔큐는 큐(queue)메커니즘에 의해 관리되며, 큐에 먼저 줄을 서는 세션이 먼저 서비스를 받는 방식을 취하고 있으나 래치는 이러한 큐 메커니즘이 적용되지 않는다. 즉 순서가 보장되지 않는다.

단일형 래치는 인스턴스 사에 단 하나만 존재하는 래치로, 어느 특정시점에 오로지 한 세션만이 해당 래치를 획득할 수 있도록 허용함으로써 담당하는 구역을 보호한다.
예를 들어 11g R1 의  granule operation 래치는 단일형 래치로, 특정시점에 단 하나의 프로세스만 이 래치를 획득할 수 있다. Shared Pool 과 같은 SGA 영역의 동적인 크기조정( Automatic Shared Memory Management)은 반드시 단 하나의 프로세스에 의해  이루어져야 하며, granule operation 래치는 동시에 두개 이상의 세션이 이 작업을 수행하지 못하도록 SGA 를 보호하는 역할을 한다.

복수형 래치의 경우
특정 프로세스가 캐시 버퍼 체인의 구조를 변경하기 위해서는 해당 구역을 담당하고 있는 캐시 버퍼 체인 래치를 먼저 획득해야 한다. 이 래치의 경우 수천 개의 차일드가 존재하기 때문에 , 캐시 버퍼 체인 구조상의 다른 구역을 변경하고자 하는 프로세스는 해당 래치를 획득하여 작업을 진행할 수 있다. 각각의 차일드 래치들은 캐시버퍼 채인을 보호하는 역할을 하며 이러한 차일드가 여러개이기 때문에 동시성이 개선되는 것이다. 

래치는 몇 바이트 정도의 메모리 리소스로 구현되며, 이 메모리 영역에 저장된 값에 따라 해당 래치가 가용한지 여부를 판단한다. 일반적로 래치의 획득을 요청하는 방식에는 세가지 모드가 있다. 
1. immediate  2. willing-to-wait  3. latch-wait posting

DML 에 의해 발생한 리두 레코드(redo record)를 SGA 의 로그버퍼( log buffer ) 에 기록하기 위해서는 프로세스가 redo copy 래치를 먼저 획득해야 한다. 인스턴스상에는 여러 개의  redo copy 래치들이 존재하며, 프로세스는 이 중 아무거나 하나 잡은 후 리두  레코드를 로그 버퍼에 기록할 수 있다.  

? 차일드 래치끼리는 서로 다른 영역을 관할하는가
? 가용한(?) 여러개의 차일드 래치들을 대상으로 순차적으로 획득을 시도하며 ....
                 ( 아무 차일드 래치나 잡아도 문제가 없는가 ? ) 

 
Reference : 래치 경합의 진단 in Expert Oracle Practices 

'---- Book Cafe ---- > Expert Oracle Practices' 카테고리의 다른 글

슬립과 스핀 (Sleep and Spin)  (0) 2011.07.23