Enq: TX - index contention

EXEM Knowledge Base

Jump to: navigation, 찾기

목차

[편집] Basic Info

비트리 인덱스는 데이터를 추가하는 과정에서 리프 노드가 꽉 차면 Split을 함으로써 균형(Balance)을 맞추게 된다. 세션 A가 TX 락을 Exclusive하게 획득한 상태에서 Split을 수행하는 도중에 세션 B가 해당 리프 노드를 변경하고자 하는 경우, 세션 B는 세션 A의 트랜잭션에 대해 TX 락을 Shared 모드로 획득하기 위해 기다려야 하며 그 동안 enq: TX - index contention 이벤트를 대기한다.

enq: TX - index contention 대기는 보통의 상황에서는 잘 발생하지 않으며 동시에 여러 세션이 인덱스가 생성되어 있는 테이블에 대해서 많은 양의 DML을 수행하는 경우에 주로 발생한다. 이 대기현상은 자주 발생하지 않지만, 생성된 인덱스의 수가 많고 인덱스를 이루는 컬럼들의 값이 커서 리프 노드 블록이 빈번하게 분할되는 경우에는 상당한 성능 저하의 원인이 된다. 특히 시퀀스 등을 사용해서 값을 생성하는 컬럼에 대해 인덱스가 생성된 경우, 항상 제일 마지막 리프 노드에만 값이 추가되는 현상이 생겨 인덱스 분할이 자주 발생할 수 있다. 이것은 정렬된 형태로 리프 노드를 유지하는 비트리 인덱스의 속성에 의해 발생하는 것으로 여러 세션에 의해서 많은 량의 데이터를 인서트(Insert)하는 경우 buffer busy waits 대기와 함께, enq: TX - index contention 대기가 같이 발생하게 된다.

[편집] Parameter & Wait Time

[편집] Wait Parameters

  • P1 : Enqueue 정보
  • P2 : usn<<16 | slot
  • P3 : sequence

[편집] Wait Time

enqueue 대기이벤트와 동일하다. 최대 3초까지 기다린다. 만일 TX 락을 획득하기 못하면 획득할 때까지 대기한다.

[편집] Check Point & Solution

[편집] Reverse 인덱스의 사용

시퀀스(Sequence)를 이용해서 인덱스 키 값을 부여하는 경우 오른쪽 리프 노드에 인서트가 집중되어 인덱스 분할이 심해진다. 이런 경우에는 Reverse 인덱스를 사용하면 오른쪽 리프 노드에 값이 집중되는 현상을 해소할 수 있다. 단, Reverse 인덱스를 사용하는 경우 인덱스 범위 스캔(Index Range Scan)이 동작하지 않는다는 사실에 유의해야 한다.

[편집] 인덱스 키 컬럼의 변경

인덱스를 구성하는 컬럼의 순서를 변경하여 특정 리프 노드에 인서트가 집중되는 현상을 막을 수 있다. 가령 기존에 인덱스 키 컬럼이 “ID” 컬럼으로만 이루어져 있었다고 하면, 이를 “STATUS+ID” 컬럼으로 변경하는 것이다. 하지만, 어플리케이션의 속성상, 반드시 특정 키를 기준으로 정렬이 된 형태를 유지해야 한다는 제약조건이 있다면 이런 방법을 사용할 수 없다. 대표적인 경우가 프라이머리 키(Primary Key)의 값을 시퀀스(Sequence)를 이용해 부여하고 /*+ INDEX_DESC */ 와 같은 힌트 등을 이용해 이 인덱스에 대해 정렬된 방식으로 데이터를 스캔하는 쿼리를 사용하는 것이다. 이런 방식으로 인덱스를 사용할 경우에는 반드시 해당 키를 기준으로 정렬이 보장이 되어야 하므로 인덱스를 구성하는 컬럼의 순서를 변경할 수 없다.

[편집] 인덱스 블록 크기의 변경

인덱스의 블록 크기를 크게 설정하는 것도 하나의 해결책이 된다. 큰 크기의 블록을 사용할 경우 하나의 블록에 들어가는 엔트리의 수가 많으므로 분할이 그만큼 덜 발생하기 때문이다. 하지만, 블록 크기가 증가하게 되면, Buffer Lock 경합에 의해 buffer busy waits 대기현상이 유발될 수 있으므로 조심해야 한다.

[편집] Event Tip

[편집] Analysis Case

[편집] 인덱스가 존재하는 테이블에 INSERT를 과도하게 수행함에 따른 성능 저하 현상

동시에 다수 세션이 인덱스가 존재하는 특정 테이블에 INSERT를 수행하여 다음과 같이 Enq: TX - index contention 대기가 발생하였다.

그림:3_4_1.jpg

INSERT 되는 테이블은 사용자 로그를 저장하는 테이블이며, 동시에 사용자가 접속하여 작업을 함으로써 발생하였다. 데이터의 조회가 아니라 기록을 목적으로 하는 테이블이므로, 인덱스를 disable하여 문제를 해결하였다.