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
    • 핫블록(Hot Block)

비효율적인 SQL

  • 비효율적인 SQL 문장이 cache buffers chains 래치 경합의 가장 중요한 원인이다.
  • 동시에 여러 프로세스가 ㅓㄼ은 범위의 인덱스나 넓은 범위의 테이블에 대해 스캔을
    수행할 경우 cache buffers chains 래치 경합이 광범위하게 발생할 수 있다

P148 참조.

핫블록(Hot Block)

  • SQL문의 작동방식이 소수의 특정 블록을 계속해서 스캔하는 형태로 작성되었다면, 여러 세션이 동시에
    이 SQL문을 수행하는 경우 핫블록에 의한 cache buffers chains 래치 경합이 발생한다.

p154 확인

  • 어플리 케이션 수정이 불가능 한 경우 우회적으로 핫블록에 의한 cache buffer chains 래치 경합을
    해소하는 방법은 핫블록에 속한 로우들을 되도록이면 다른 블록으로 분산시키는 것이다.
  • HotBlock 해소 방법
  1. PCTFREE를 높게 주거나 작은 크기의 블록을 사용함으로써 블록 경합을 줄인다.
    PCTFREE를 높게 주는 것과 작은 크기의 블록을 사용하는 것은 하나의 블록에 포함되는 로우수를 줄임으로써
    블록 경합을 피하는 방법이다. 이 방법은 확실히 블록 경합을 줄이는 효과가 있지만 그 만큼 관리해야 할
    블록수가 늘어남으로써 동일한 쿼리가 훨씬 더 많은 블록을 스캔해야 하기 때문에 성능 저하 현상이 생기게 된다.
    즉 핫블록에 의한 래치 경합은 줄어들지만, 늘어난 스캔 회수만큼 다시 래치 경합이 증가할 수도 있다.
  2. 파티셔닝(Partitioning) 기법을 사용해서 로우가 물리적으로 다른 블록으로 들어가게끔 한다.
    이 기법을 사용하면 문제가 되는 로우들이 자연스럽게 물리적으로 다른 블록에 분산시킴으로써 래치 경합을
    피할 수 있다. 하지만, 테이블에 대해서 이 방법을 적용할 경우에는 인덱스의 클러스터링 팩터(Clustering Factor)
    를 악화시킬 수 있으며, 이로 인해 인덱스 범위스캔에 의한 데이터 스캔 속도가 저하될 수도 있다.
  3. 문제가 되는 블록의 로우들에 대해서만 삭제 후 재 삽입 작업을 한다. 이 방법은 테이블에 대해서만 가능하다.
    문제가 되는 블록들과 해당 블록에 포함된 로우들의 ROWID 를 정확하게 알 수 있다면 해당 로우를 삭제한 후
    재삽입해서 각 로우가 다른 블록에 흩어지게 할 수 있다.
  • 인덱스에서의 경합 문제는 상당히 까다롭다. 정렬된 상태로 저장된다는 인덱스의 고유 특성 때문에 임의의
    블록으로 분산시키는 것이 불가능한 경우가 있기 때문이다. 이 경우에는 PCTFREE를 높게 주거나 작은 크기의
    블록을 사용하는 방식을 사용하는 것 외에는 뾰족한 대책이 없다. 하지만 블록의 개수가 늘어나게 되고 이로 인해
    오히려 래치 경합이 줄어들지 않는 경우도 있으므로 적용 시에 유의해야 한다.