enq:TX - index contention

장수윤·2025년 2월 21일

어제 서비스에서 active session이 갑작스럽게 많이 발생하여 원인을 파악하고자 로그를 찾아보는데 log file syncenq:TX - index contention이 다수 발생한것으로 보였다.

다수의 세션이 동시에 동일한 인덱스 블록에 접근하거나 수정하려 할 때 발생하는 현상으로, 데이터베이스 성능 저하의 원인이 될 수 있습니다.

UPDATE 시 인덱스 경합이 발생하는 주요 원인:

1. 단조 증가하는 인덱스 키 사용:

시퀀스나 타임스탬프와 같이 지속적으로 증가하는 값을 인덱스 키로 사용하는 경우, 새로운 데이터는 항상 인덱스의 특정 부분에 집중됩니다. 이로 인해 해당 블록에서 경합이 발생할 수 있습니다.

2.인덱스 블록 분할(Index Block Split):

인덱스 블록이 가득 차면 새로운 데이터를 삽입하거나 기존 데이터를 수정할 때 블록을 분할해야 합니다. 이 과정에서 다른 세션은 분할이 완료될 때까지 대기하게 되어 경합이 발생합니다.

UPDATE 시 인덱스 블록 경합 발생 과정:

  1. 동시성 업데이트 요청: 여러 세션이 동시에 동일한 인덱스 키 값을 업데이트하려고 시도합니다.
  2. 리프 노드 접근: 각 세션은 해당 인덱스 키 값을 찾기 위해 루트 노드에서 시작하여 브랜치 노드를 거쳐 리프 노드에 도달합니다.
  3. 리프 노드 잠금: 동일한 리프 노드를 여러 세션이 동시에 수정하려고 하면, 첫 번째 세션이 해당 리프 노드를 잠금(Lock) 상태로 만들고, 다른 세션들은 잠금이 해제될 때까지 대기하게 됩니다.
  4. 경합 발생: 이러한 대기 상태가 인덱스 블록 경합을 유발하며, 시스템의 전체적인 성능 저하로 이어질 수 있습니다.

시각적 예시:

아래는 여러 세션이 동시에 동일한 리프 노드에 접근하여 경합이 발생하는 상황을 도식화한 것입니다.

세션 1:    세션 2:    세션 3:
  |          |          |
  v          v          v
        [ 루트 노드 ]
             |
        [ 브랜치 노드 ]
             |
        [ 리프 노드 ]  <-- 동시에 접근하여 경합 발생
profile
oracle db

0개의 댓글