어제 서비스에서 active session이 갑작스럽게 많이 발생하여 원인을 파악하고자 로그를 찾아보는데 log file sync와 enq:TX - index contention이 다수 발생한것으로 보였다.
다수의 세션이 동시에 동일한 인덱스 블록에 접근하거나 수정하려 할 때 발생하는 현상으로, 데이터베이스 성능 저하의 원인이 될 수 있습니다.
UPDATE 시 인덱스 경합이 발생하는 주요 원인:시퀀스나 타임스탬프와 같이 지속적으로 증가하는 값을 인덱스 키로 사용하는 경우, 새로운 데이터는 항상 인덱스의 특정 부분에 집중됩니다. 이로 인해 해당 블록에서 경합이 발생할 수 있습니다.
인덱스 블록이 가득 차면 새로운 데이터를 삽입하거나 기존 데이터를 수정할 때 블록을 분할해야 합니다. 이 과정에서 다른 세션은 분할이 완료될 때까지 대기하게 되어 경합이 발생합니다.
아래는 여러 세션이 동시에 동일한 리프 노드에 접근하여 경합이 발생하는 상황을 도식화한 것입니다.
세션 1: 세션 2: 세션 3:
| | |
v v v
[ 루트 노드 ]
|
[ 브랜치 노드 ]
|
[ 리프 노드 ] <-- 동시에 접근하여 경합 발생