2010년 10월 25일 월요일

b*tree 인덱스의 구조 및 성능 2

전에 알아본 b*tree 인덱스(이하 인덱스)의 기본 구조는 이러합니다.

인덱스의 전체 값은 1,2,3......10000이라는 값이 저장되어 있습니다.

이러한 구조에서 ROOT BLOCK에 값이 100, 200, 300 ...... 10000이라는 100개의 값이 들어가고, 100 에는 1부터 100이 저장되어 있는 LEAF BLOCK의 주소가 연결되어 있습니다.

이러한 구조에서 0 이라는 값을 저장하게 되면 어떻게 될까요.

인덱스는 조회에서 성능향상을 달성하기 위해서 만들어진 구조입니다.

이러한 성능향상을 위해 인덱스는 정렬된 결과의 값들이 순차적으로 저장이 되어 있죠.

이 말은 조회시 정렬을 매번 하는 것이 아니라 정렬된 값들에서 원하는 값을 조회하겠다는 것입니다.

그러한 이유로 저장시 조금의 부하가 발생한다 하더라도 저장되는 값을 정렬되는 구조로 저장을 하는 것입니다.

ROOT BLOCK에는 100, 200, 300 ...... 10000 이라는 값이 모두 저장되어 있고, LEAF BLOCK에는 1 - 100, 101 - 200, 201 - 200 ...... 9001 - 10000이라는 값이 저장되어 있는 구조에서 0 이라는 값은 어디에 저장되 될까요?

우선 ROOT BLOCK는 아무런 변화가 없습니다.

왜냐하면 0은 100 이하이기에 0 이라는 값을 찾는 첫 위치에는 변화가 있을 필요가 없기 때문입니다.

그럼 0 이라는 값을 저장하기 위해서 인덱스는 어떠한 변화를 가져올까요?

1 - 100 이 저장되어 있는 LEAF BLOCK에 변화가 발생됩니다.

1 - 100 이 저장되어 있는 LEAF BLOCK의 값이 50, 100 으로 단 두개의 값만 가지는 블럭으로 바뀌게 됩니다.

그리고 이 블럭은 LEAF BLOCK에서 BRANCH BLOCK으로 바뀌는 것입니다.

그럼 50, 100 이라는 값에는 어떠한 정보를 가리키고 있을까요?

1 - 100 이라는 값에 0 이 들어갔으므로 0 - 50, 51 - 100 의 값이 들어가게 되는 LEAF BLOCK이 2개 생성되게 됩니다.

그리고 이 2개의 BLOCK은 BRANCH BLOCK으로 바뀐 BLOCK의 50, 100 의 값에 연결이 됩니다.

그럼 인덱스 조회로 0 이라는 값을 조회하게 되면 0 은 100 이하이므로 ROOT BLOCK의 100 이 가리키고 있는 BLOCK을 조회하게 되는데, 이 BLOCK이 LEAF BLOCK이 아니고 BRANCH BLOCK으로 바뀌었으므로 50, 100 의 값에서 0 이라는 값이 50 이하이므로 50 이 가리키고 있는 LEAF BLOCK에서 0 의 값을 찾아 DATA BLOCK을 조회하게 됩니다.

이러한 구조의 인덱스를 밸런스가 깨졌다라고 합니다.

모든 LEAF BLOCK에 레벨 2의 구조를 가지고 있지만 하나의 블럭이 레벨 3의 구조를 가지고 있기 때문입니다.

이렇게 하나의 블럭만 밸런스가 틀려진다고 해서 큰 문제가 발생하는 것은 아니지만 상당히 많은 블럭이 밸런스가 깨지면 인덱스를 새로 정리해야 합니다.

이럴때 사용하는 명령어가 ALTER INDEX index_name REBUILD 입니다.

이 명령으로 인덱스의 값들을 모두 다시 정렬하여 저장하게 되므로 인덱스의 밸런스를 맞출수가 있습니다.

인덱스 관리의 기본이라고 할 수 있죠.

인덱스의 통계 생성 명령어는 아래와 같습니다.

ANALYZE INDEX index_name COMPUTE STATISTICS

위의 명령어로 인덱스의 통계를 생성한 후

SELECT * FROM USER_INDEXES 로 해당 인덱스의 구조를 알 수 있습니다.

여기까지 인덱스 구조에 대해서 알아봤습니다.

명령어 및 쿼리의 자세한 내용은 다음에 정리하겠습니다.

댓글 없음:

댓글 쓰기