본문 바로가기
ORACLE

Enq: TX - index contention

by 더킹123 2021. 5. 14.
728x90

Enq: TX - index contention

##enq: TX - index contention 이란?

비트리 인덱스는 데이터를 추가하는 과정에서 리프 노드가 꽉 차면 Split을 함으로써 균형을 맞추게

된다. 세션 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 대기가 같이 발생하게 된다.

 

##해결방법

-Reverse 인덱스의 사용

 시퀀스를 이용해서 인덱스 키 값을 부여하는 경우 오른쪽 리프 노드에 인서트가 집중되어 인덱스

 분할이 심해진다. 이런 경우에는 Reverse 인덱스를 사용하면 오른쪽 리프 노드에 값이 집중되는

 현상 을 해소할 수 있다. 단,Reverse 인덱스를 사용하는 경우 인덱스 범위 스캔이 동작하지

 않는다는 사실에 유의해야 한다.

 

-인덱스 키 컬럼의 변경

  인덱스를 구성하는 컬럼의 순서를 변경하여 특정 리프 노드에 인서트가 집중되는 현상을 막을 수

  있다.  

 

-인덱스 블록 크기의 변경

  인덱스의 블록 크기를 크게 설정하는 것도 하나의 해결책이 된다. 큰 크기의 블록을 사용할 경우

  하나의 블록에 들어가는 엔트리의 수가 많으므로 분할이 그만큼 덜 발생하기 때문이다. 하지만,

  블록 크기가 증가하게 되면, Buffer Lock 경합에 의해 buffer busy waits 대기현상이 유발될 수

  있으므로 조심해야 한다.

728x90

'ORACLE' 카테고리의 다른 글

대표적인 enq: TX락  (0) 2021.05.14
optimizer_mode 파라미터  (0) 2021.05.14
LRU 알고리즘  (0) 2021.05.14
DB락 조회  (0) 2021.05.14
래치(Latch)와 락(Lock) 비교  (0) 2021.05.14

댓글