Working Set(LRU + LRUW)을 탐색하거나 변경하려는 프로ㅔ스는 항상 해당 Working Set을 관리하는 cache buffers lru chain 래치를 획득해야 한다. cache buffers lru chain 래치를 획득하는 과정에서 경합이 발생하면 latch : cache buffers lru chain 이벤트를 대기하게 된다.
cache buffer lru chain 래치를 획득하는 경우
프로세스가 아직 메모리에 올라오지 않은 블록을 읽고자 할 경우에는 프리버퍼를 할당받기 위해 LRU 리스트를 탐색하게 되는데, 이 과정에서 cache buffers lru chain 래치를 획득해야 한다.
DBWR이 더티 버퍼를 파일에 기록하기 위해 LRUW 리스트를 탐색하고, 해당 버퍼를 LRU리스트로 옮기는 과정에서도 cache buffers lru chain 래치를 획득해야 한다. DBWR은 다음과 같은 경우 더티 버퍼를 파일에 기록한다.
오라클 프로세스가 프리버퍼를 획득하기 위해 DBWR에게 더티 버퍼를 기록해 줄 것을 요청하는 경우
오라클 프로세스가 Paralle Query나 Tablespace Backp, Truncate/Drop 등의 작업을 수행하기 위해 관련된 객체의 더티 버퍼를 기록해주 것을 요청하는 경우
주기적으로 또는 관리상의 이유로 체크포인팅이 수행되는 경우
cache buffers lru chain 래치 경합의 가장 주된 원인은 과도한 프리 버퍼의 요청이다.
비효율적인 SQL 문장이 프리 버퍼를 과도하게 요청하는 가장 전형적인 경우로, 동시에 여러 세션이 비효율적인 SQL문장을 수행하게 되면 프리 버퍼를 탐색하는 과정에서 그리고 더티 버퍼를 기록하는 과정에서 cache buffers lru chain 래치를 획득하기 위해 경쟁하게 된다.
동일 테이블이나 인덱스를 여러 세션이 동시에 스캔하는 경우라면, cache buffers chains 래치 경합이 발생할 확률이 높다. 동일 체인에 대한 경합이 발생하기 때문이다.
다른 테이블이나 인덱스들을 여러 세션이 동시에 스캔하는 경우라면 cache buffers lru chain 래치 겨합이 발생할 확률이 높다. 여러 세션들이 모두 다른 블록들을 메모리에 올리는 과정에서 프리 버퍼를 확보하기 위한 요청이 많아지고 이로 인해 Working Set에 대한 경합이 발생할 확률이 높아진다.
데이터의 변경이 빈번해서 더티 버퍼의 개수가 많고 이로 인해 DBWR이 체크포인트를 위해 LRUW 리스트르르 탐색하는 회수가 잦다면 cache buffers lru chain 래치의 경합은 더욱 심해 진다.
cache buffers lru chain 스캔에 의한 문제라면 db file sequential read 대기와 lru chain 래치 경합이 함께 발생하게 되고, 불필요한 풀테이블 스캔이 많다면 db file scattered read 대기와 lru chain 래치 경합이 함께 발새하게 된다.
실제로는 cache buffers chains 래치 경합과 cache buffers lru chain 래치 경합이 같이 발생하는 경우가 많은데, 복잡한 어플리케이션들에서 위에서 언급한 패턴들이 복합적으로 사용되기 때문이다.
버퍼 캐시의 크기가 지나치게 작거나 체크포인트 주기가 지나치게 ?은 경우에도 cache buffers lru chain 래치 경합이 증가한다.