Index Split이란 b-tree index의 block이 가득 찰 경우 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으로 분류 된다.
2개의 Leaf Block이 꽉찬 경우에 중간값이 추가되면 Leaf Block을 추가한 후 이후 어느 block에 값이 추가될지 모르기 때문에 50:50으로 분할 하는것이 가장 이상 적이다.
하지만 최대값이 추가될 경우에는 90:10으로 분할하는 것이 이상적이다. 계속해서 최대값이 추가된다고 가정했을 때 새로 할당된 block이 비어 있기 때문에 split 횟수를 크게 줄일 수 있다.
Index Split 문제점
Index Split은 고비용의 작업으로 많은 Index Split 발생은 성능에 영향을 미친다.
Index Split이 발생하면 많은양의 redo를 생성하고 이로인해 physical I/O를 유발하게되며 TX Lock 경합을 유발하기도 한다.
TX Lock 경합이란 leaf block에 대해 서로 다른 유저가 insert를 할 경우 A유저가 insert 중 split이 발생하면 B유저는 insert를 수행하지 못하고 'enq: TX-index contention' 이벤트가 발생하면서 대기하는 현상을 말한다.
또한 Index Split에 의해 늘어난 index block은 rollback을 하더라도 다시 줄어들지 않는다. 그렇기 때문에 Index의 크기가 점점 커지게 된다.
Branch Node Split의 경우에는 Leaf Node Split 보다 더욱 무거워 진다. 그렇기 때문에 오라클은 가능하면 Index Split을 줄이려고 한다.
Index Split 대처 방법
Index Split을 피하기 위한 가장 좋은 방법은 동시 session의 수를 줄이는 것이다.
이것이 불가능하면 불필요한 index를 삭제하므로서 split을 줄이거나 또는 index 생성시 PCTFREE를 높게 설정해주는 방법이 있다.
index 생성시 PCTFREE를 높게 주게 되면 대부분의 block들은 상당히 비워져 있는 상태가 된다. 하지만 key insert시에는 PCTFREE가 무시되기 때문에 split에 의한 성능 저하는 언제든지 재발 할 수 있다. 그렇기 때문에 주기적으로 rebuild 해주어야 한다.
계속 최대값이 추가되면서 90:10 split이 문제가 된다면 reverse key index로 random하게 분산해서 90:10 split은 줄일 수 있다. 하지만 reverse key index를 사용 할 경우 index가 커지게 되고 50:50 split은 늘어나게 된다.
해결 방법은 이것 외에 여러가지 방법이 있을 수 있으나 index와 관련된 성능문제는 해결하기가 까다롭다.
'오라클 > Admin1' 카테고리의 다른 글
dbcontrol 수동 설치 (0) | 2010.06.15 |
---|---|
Enabling iSQL*Plus DBA Access (0) | 2010.06.15 |
수동 Database 생성 (0) | 2010.06.15 |
[Oracle Virus] - Index 크기 문제 (0) | 2010.05.16 |
[Oracle Virus] - Index Split (0) | 2010.05.16 |