Chap01. 01 인덱스 구조
01. 범위스캔
- 필요한 데이터만 빠르고 효율적으로 액세스할 목적으로 사용하는 오브젝트
- B*Tree Index는 Balanced Index
Index는 책의 목차로 표현을 많이하는데요.
이유는?
책의 특정 주제를 찾고 싶을 때 목차에서 확인 후
페이지를 한장 한장 넘지기 않고 Direct로 찾아 가기 때문입니다.
Index도 목차처럼 Data를 하나하나 확인하지 않고 Direct로 찾아 가는 부분이 비슷하다고 할 수 있습니다.

목차가 글쓴이의 의도에 따라 정렬된 것 처럼
Index는 생성할 때의 키 컬럼 순으로 정렬되어 있습니다.
예를 들어보면?
-- Index 생성문
CREATE INDEX IDX_EMP_01 ON EMP(EMPNO);

EMPNO라는 사원번호 컬럼 기준으로 오름차순으로 정렬된 것을 볼 수 있습니다.
여기서 7400~7800 사원번호(검색조건)가 알고 싶은 부분이라면
레코드로는 사원번호 7499부터 7788까지 탐색하게 되는데
이를 범위스캔 이라 할 수 있습니다.
02. 인덱스 기본 구조
[그림1]

- Root Block = 하위 Branch Block의 물리주소(DBA) + Key 값
- Branch Block N Depth = 하위 Leaf Block의 물리주소 + Key 값
- Branch Block에 저장된 레코드 개수는 바로 하위 레벨의 Block 개수와 일치
- Leaf Block = RowId + Key 값
- Leaf Block의 Key값이 같을 경우 RowId 순으로 정렬
LMC(LeftMostChild) : 그 브랜치 블록의 자식 노드 중 가장 왼쪽 끝에 위치한 블록을 의미
값이 없는 키로서 해당 Block의 시작점을 가르키는 즉 가장 왼쪽에 위치한 엔트리(Key+DBA)
를 가르킵니다.
Index를 자세히 보자면 아래 사진과 같습니다.(Leaf Block의 모습)

Oracle Index 특징
- Index 구성 컬럼이 모두 NULL인 레코드는 저장하지 않습니다. (Oracle 기준, 아닌 DBMS도 존재)
- Index(Leaf)와 테이블 레코드 간에 1:1 대응 관계를 가집니다.
- 테이블 레코드 갱신 시 Leaf Block의 Index Key 값도 같이 갱신됩니다.
- Branch Block은 Index Split(분할)에 의해 새로운 블록의 추가/삭제 될 때만 갱신됩니다.
03. 인덱스 탐색
인덱스 탐색은 크게 수직적탐색, 수평적탐색 으로 나뉠수 있습니다
수평적 탐색 : [그림1] 의 Leaf Block의 좌우로 범위스캔하는 것
수직적 탐색 : 수평적 탐색을 위한 시작 지점을 찾는 과정
Root Block 부터 Branch Block을 거쳐
수평적 탐색을 시작점을 알기 위해 Leaf Block에 찾아가는 탐색
※ 아래 삼각형 표시를 [그림1] 의 구조, Index를 삼각형으로 표현한 것입니다.

[Branch Block 스캔 시 주의점]
[그림2]

만약 위 인덱스에서 값이 3인 레코드의 시작점을 찾아간다고 가정해봅시다.
- Root Block에서 LMC와 3 중 어디를 선택해야할까요?
- 필자는 단순히 3이라고 생각했습니다.
- 다시 생각해보면 Root나 Branch Block은 하위 Block을 가지고 있다고 하였지요.
- 2번 Branch에서 마지막 3을 찾은 후 왼쪽으로 스캔하면서 마지막으로 나오는 2를 만나는 순간 leaf block으로 내려갑니다.
- leaf block에서 수평적 탐색을 하면서 처음 나오는 3을 찾습니다.
[결합Index 모습]

-- Index 생성문
CREATE INDEX IDX_EMP_02 ON EMP(DEPTNO, SAL);
04.RowId 포맷
RowId
- Table Record를 찾아가는 물리적주소
- Table 자체에 저장되지 않으며 Index에 저장, pseudo 컬럼
- Oracle 8i 이상 -> 확장 RowId 포맷 (8i부터 변경)
- 데이터 오브젝트 번호(6자리) + 데이터파일 번호(3자리) + 블록 번호(6자리) + 로우 번호(3자리)
Oracle 8i 기준으로 RowId 포맷 요소가 달라졌다.
Oracle 7 버전이하 -> 제한 RowId 포맷
Oracle 8i 이상 -> 확장 RowId 포맷