Index Split

EXEM Knowledge Base

Jump to: navigation, 찾기

목차

[편집] 개요

오라클의 B-Tree 인덱스의 블록이 꽉 찰(Full) 경우, Split을 통해 새로운 공간을 확보한다. Index Split의 종류는 다음과 같이 나뉜다.

  • Branch Node Split: Branch Node나 Root Node가 꽉 찰 경우 발생하는 Split이다. 항상 50:50으로 Split이 이루어진다.
  • Leaf Node Split: Leaf Node가 꽉 찰 경우 발생하는 Split이다. Split이 발생하는 위치에 따라 50:50 Split과 90:10 Split으로 분류된다.

Index Split은 인덱스의 크기가 커가는 과정에서 필연적으로 발생하는 현상으로 이를 피할 방법은 없다. 하지만 동시에 많은 세션이 DML을 수행하는 과정에서 Index Split이 발생하면 경합이 발생하고 전반적인 성능 저하가 발생할 수 있다.

[편집] 상세 내용

[편집] 50:50 vs. 90:10

일반적인 Leaf Node Split은 50:50의 비율로 이루어진다. 즉, Leaf Block이 꽉 차면 새로운 블록을 할당받은 다음, 기존 블록과 새 블록에 50:50으로 키 값을 재분배한다. 하지만 가장 최우측 Leaf Node에서 최대 키 값이 삽입됨으로써 Split이 발생하는 경우에는 새로 할당된 블록에는 새로 추가된 키 값만이 추가된다. 즉 기존의 꽉 찬 블록의 키 값을 재분배하지 않는다. 이런 이유 때문에 90:10 Split을 99:1, 또는 100:0 Split으로 부르기도 한다. 90:10 Split은 인덱스 키값이 단방향으로 증가하면서 키 값이 삽입되는 경우에 발생한다.

그림:IndexSplit.gif

[편집] Index Split과 통계값

Index Split과 관련된 오라클 통계값은 아래와 같다.

SQL> SELECT * FROM v$statname WHERE name LIKE '%split%' AND name LIKE '%node%';
STATISTIC#	NAME			CLASS	STAT_ID
262		leaf node splits	128	1417124053
263		leaf node 90-10 splits	128	1285138251
264		branch node splits	128	399027615

[편집] Index Split와 대기이벤트

  • enq: TX - index contention : 하나의 트랜잭션이 인덱스 블록을 Split하는 동안, 동일 인덱스 블록을 사용하려는 다른 트랜잭션은 enq: TX - index contention 이벤트를 대기한다.
  • gc current split: RAC에서 Index Split이 발생하는 경우에 발생하는 이벤트이다. 인스턴스 A가 특정 인덱스 블록에 대한 전송을 인스턴스 B에 요청했다고 가정해보자. 인스턴스 B의 LMS 프로세스가 해당 인덱스 블록을 전송하려고 하는 시점에 Index Split이 발생하는 경우, LMS 프로세스가 Split이 끝날 때까지 대기한 후 해당 블록을 전송한다. 이때 응답을 받은 인스턴스 A는 gc current split을 대기한 것으로 보고하게 된다.


[편집] Sequence와 Index Split

Sequence를 이용해서 인덱스 키 값을 생성하는 경우가 Index Split이 과도하게 발생하는 주된 원인 중 하나이다. 항상 최우측 노드에서만 Insert가 집중되면서 Split이 빈번하게 발생하기 때문이다. Index에 의한 Ordering이 불필요한 경우에는 Reverse Index를 사용함으로써 이러한 현상을 피할 수 있다.


[편집] 무분별한 인덱스 생성

불필요한 인덱스를 무분별하게 생성하고, 불필요한 키값을 인덱스에 추가하는 것 또한 Index Split이 과도하게 발생하는 주된 원인 중 하나이다. 인덱스는 꼭 필요한 컬럼에 대해서만 생성하고, 중복 인덱스는 가급적이면 피하는 것이 좋다.

[편집] Index Split과 Autonomous Transaction

트랜잭션 수행 도중 Index Split 작업이 필요한 경우, Oracle은 Autonomous Transaction을 이용해서 Split 작업을 수행한다. 따라서 부모 트랜잭션이 롤백되더라도 Index Split 작업은 Autonomous Transaction에 의해 영구적으로 기록된다.


[편집] 관련 정보

  1. enq: TX - index contention 대기이벤트
  2. gc current split 대기이벤트


[편집] 외부 참조

  1. Index Internal - Richard Foote