gc current split

  • gc current split 이벤트는 gc cr/current request 이벤트에 대해 Fixed-up 이벤트.
  • 홀더 노드가 인덱스 블록을 전송하는 과정에서 인덱스 분할(Index Split)이 발생했음을 의미.
    • 요청 노드의 유저 프로세스가 특정 인덱스 블록을 읽고자 한다.
    • 유저 프로세스는 해당 블록의 적절한 버전이 로컬 버퍼 캐시에 없는 것을 확인하고,
      마스터 노드의 LMS 프로세스에 블록 전송을 요청.(응답을 받을 때까지 gc cr/current request 이벤트 대기)
    • 홀더 노드의 LMS 프로세스가 해당 인덱스 블록에 대해 락을 획득하려고 하는 시점에 인덱스 분할이 발생하고 있다면, 인덱스 분할이 끝날 때까지 대기.
      인덱스 분할이 끝나고 나면 홀더 노드는 해당 블록과 함께 인덱스 분할이 발생했음을 나타내는 메시지를 함께 전송.
    • 유저 프로세스는 블록을 전송 받은 후 응답 메시지로부터 전송 과정에서 인덱스 분할이 발생중임을 확인하고,
      gc cr/current request 이벤트를 Fixed-up 이벤트인 gc current split 이벤트로 변경.
  • 루트 노드, 브랜치 노드, 리프 노드 블록에 무관하게 해당 블록이 인덱스 분할을 위해 블로킹되고 있는 상황에서는 공통적으로 발생.
  • 특정 노드를 분할하는 과정에서는 그 부모 노드의 블록도 변경이 금지되기 때문.
  • gc current split 이벤트와 관련 있는 또 하나의 대기 이벤트는 enq: TX index contention 이다.
  • 테이블의 특정 로우를 변경하고자 하는 프로세스는 관련된 인덱스 블록이 다른 프로세스에 의해 분할되고 있다면,
    인덱스 분할이 완료될때까지 기다려야 한다. 이때 대기하는 이벤트가 enq: TX index contention 이다. (p.117 trace 참고)
  • gc current split 이벤트가 많이 목격된다는 것은 동일 테이블 블록에 대한 인덱스 분할이 과도하게 발생한다는 것을 의미
  • 해소방법은 enq: TX index contention 이벤트를 해소하는 기법과 동일
    • 시퀀스 값을 사용해서 인덱스 키를 생성하는 경우에는 가장 오른쪽 리프 블록에 삽입이 집중되어 인덱스 분할에 의한 경합이 많이 발생.
      인덱스에 파티셔닝을 적용하거나, 인덱스 키에 컬럼을 추가하여 우편향(Right-hand) 현상을 해소.
    • 시퀀스의 캐시를 증가시킨다. 시퀀스의 캐시의 크기가 크면 각 노드에서 사용하는 시퀀스의 값
      집합이 큰 차이를 보이기 때문에 동일한 인덱스 리프 블록에 대한 경합이 준다.(4장에서 설명)
    • 인덱스 블록의 블록 크기를 키우는 방법. 여러 상황을 고려해 신중히 결정.
      블록크기가 커지면 인덱스 분할 회수는 줄지만 버퍼 락 경합은 증가하기 때문.

문서에 대하여

  • 최초작성자 : 김종원
  • 최초작성일 : 2011년 03월 25일
  • 이 문서는 오라클클럽 코어 오라클 데이터베이스 스터디 모임에서 작성하였습니다.
  • {*}이 문서의 내용은 (주)엑셈에서 출간한 'RAC Advanced OWI, Internals and Performance in Oracle 10g'를 참고하였습니다.*