latch:cache buffers chains
- 버퍼 캐시를 사용하기 위해 해시 체인을 탐색하거나 변경하려는 프로세스는 반드시 해당 체인을
관리하는 cache buffers chains 래치를 획득해야 한다. - cace buffers chains 래치를 획득하는 과정에서 경합이 발생하면 latch:cache buffers chains 이벤트를 대기
- 오라클 9i 이후부터는 읽기 전용의 목적으로 체인을 탐색하는 경우에는 cache buffers chains 래치를
Shared 모드로 공유할 수 있어 경합을 줄이는데 도움이 된다.
Shared모드의 cache buffers chains 래치
만일 cache buffers chains 래치를 공유할 수 있다면 이론적으로는 동신 Select에 의한 cache buffers chains
래치 경합은 전혀 발생하지 않아야 한다. 하지만 실제로 동시 Select인 경우에도 래치 경합은 여전히 발생한다.
그 이유는 buffer lock과 관련이 있다. 읽기 작업을 위해서 Sahred 모드로 래치를 획득한 경우, 실제 버퍼를
읽는 과정에서 buffer lock을 Shred 모드로 획득해야 하는데 이 과정에서 버퍼 헤더의 정보를 일부 변경해야 한다.
따라서 buffer lock을 ㅚㄱ득하는 동안에는 래치를 Exclusive 모드로 벼경해야 하고 buffer lock을 해제하는 동안에도
래치를 Exclusiv 하게 획득해야 한다. 이 과정에서 경합이 발생하고 이로 인해 ltch:cache buffers chains 이벤트를 대기하게 된다.
- cache buffers chains 래치 경합이 발생하는 대표적인 경우
비효율적인 SQL
- 비효율적인 SQL 문장이 cache buffers chains 래치 경합의 가장 중요한 원인이다.
- 동시에 여러 프로세스가 ㅓㄼ은 범위의 인덱스나 넓은 범위의 테이블에 대해 스캔을
수행할 경우 cache buffers chains 래치 경합이 광범위하게 발생할 수 있다
P148 참조.
핫블록(Hot Block)
- SQL문의 작동방식이 소수의 특정 블록을 계속해서 스캔하는 형태로 작성되었다면, 여러 세션이 동시에
이 SQL문을 수행하는 경우 핫블록에 의한 cache buffers chains 래치 경합이 발생한다.
p154 확인
- 어플리 케이션 수정이 불가능 한 경우 우회적으로 핫블록에 의한 cache buffer chains 래치 경합을
해소하는 방법은 핫블록에 속한 로우들을 되도록이면 다른 블록으로 분산시키는 것이다. - HotBlock 해소 방법
- PCTFREE를 높게 주거나 작은 크기의 블록을 사용함으로써 블록 경합을 줄인다.
PCTFREE를 높게 주는 것과 작은 크기의 블록을 사용하는 것은 하나의 블록에 포함되는 로우수를 줄임으로써
블록 경합을 피하는 방법이다. 이 방법은 확실히 블록 경합을 줄이는 효과가 있지만 그 만큼 관리해야 할
블록수가 늘어남으로써 동일한 쿼리가 훨씬 더 많은 블록을 스캔해야 하기 때문에 성능 저하 현상이 생기게 된다.
즉 핫블록에 의한 래치 경합은 줄어들지만, 늘어난 스캔 회수만큼 다시 래치 경합이 증가할 수도 있다. - 파티셔닝(Partitioning) 기법을 사용해서 로우가 물리적으로 다른 블록으로 들어가게끔 한다.
이 기법을 사용하면 문제가 되는 로우들이 자연스럽게 물리적으로 다른 블록에 분산시킴으로써 래치 경합을
피할 수 있다. 하지만, 테이블에 대해서 이 방법을 적용할 경우에는 인덱스의 클러스터링 팩터(Clustering Factor)
를 악화시킬 수 있으며, 이로 인해 인덱스 범위스캔에 의한 데이터 스캔 속도가 저하될 수도 있다. - 문제가 되는 블록의 로우들에 대해서만 삭제 후 재 삽입 작업을 한다. 이 방법은 테이블에 대해서만 가능하다.
문제가 되는 블록들과 해당 블록에 포함된 로우들의 ROWID 를 정확하게 알 수 있다면 해당 로우를 삭제한 후
재삽입해서 각 로우가 다른 블록에 흩어지게 할 수 있다.
- 인덱스에서의 경합 문제는 상당히 까다롭다. 정렬된 상태로 저장된다는 인덱스의 고유 특성 때문에 임의의
블록으로 분산시키는 것이 불가능한 경우가 있기 때문이다. 이 경우에는 PCTFREE를 높게 주거나 작은 크기의
블록을 사용하는 방식을 사용하는 것 외에는 뾰족한 대책이 없다. 하지만 블록의 개수가 늘어나게 되고 이로 인해
오히려 래치 경합이 줄어들지 않는 경우도 있으므로 적용 시에 유의해야 한다.