새로 쓴, 대용량 데이터베이스 솔루션 vol.1을 공부하며 여기에 정리해본다.
B-Tree 인덱스 블록의 분할(Split)
- 인덱스의 중간값으로 데이터가 삽입되는 경우 인덱스 정렬을 준수해야 하기 때문에 인덱스 블록이 분할되며 삽입이 이루어진다.(단 분할은 PCTFREE가 초과하는 경우 발생)
- 그러므로 인덱스가 ‘발생일시+항목’ 따위로 구성된다면 인덱스의 제일 뒤로 Append 되기 때문에 인덱스 블록의 분할은 발생하지 않으므로 효율이 좋아진다.
B-Tree 인덱스의 삭제 및 갱신
- 삭제가 되는 경우 인덱스에 삭제 플래그만 추가되므로 문제는 없으나 인덱스 저장 공간의 낭비가 발생한다.
- 인덱스 컬럼이 갱신되는 경우, 내부적으로 삭제 및 삽입이 발생한다.
B-Tree 인덱스를 경유한 검색
① 루트 블록을 찾는다.
② 주어진 값보다 같거나 큰 최소값을 찾는다.(>=)
ü 만약, 첫 번째 로우가 주어진 값보다 크면 Lmc(Left Most Child Block)에 있는 dba(Data Block Address)로 이동한다.
ü 만약, 동일한 값이 있으면 그 로우에 있는 dba로 이동한다.
ü 만약, 동일한 값이 없다면 큰 것 중에서 가장 작은 값을 갖는 브랜치 로우에 있는 dba로 이동한다.
③ 리프 블록을 찾을 때까지 2의 단계를 반복해서 수행한다.
④ 리프 블록에서 주어진 값을 가진 키를 찾아 존재하면 ROWID를 이용해 테이블을 액세스하고 그렇지 않으면 ‘No Data Found’로 결과를 리턴한다.
$궁금증
- 해시 클러스터링과 리버스 키 인덱스는 둘 다 ‘=’로 검색하는데 효율적이다.(아니 ‘=’로만 검색할 수 있고 범위 검색은 거의 무용지물이라 할 수 있다. 그렇다면 이 둘의 차이는 무엇일까?
알려진 대로 해시 클러스터링은 코드성 테이블이나 우편번호 같은 데 유용하다.