오라클 성능고도화 2권

Chap01. 01 인덱스 구조

Tech_Wave 2021. 7. 13. 18:19

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]

B*Tree Index 구조

 

더보기

LMC(LeftMostChild) : 그 브랜치 블록의 자식 노드 중 가장 왼쪽 끝에 위치한 블록을 의미

                                    값이 없는 키로서 해당 Block의 시작점을 가르키는 즉 가장 왼쪽에 위치한 엔트리(Key+DBA)

                                    를 가르킵니다.

 

Index를 자세히 보자면 아래 사진과 같습니다.(Leaf Block의 모습)

EMP 테이블의 ENAME 기준 Index

 

 

 

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 모습]

EMP 테이블의 DEPTNO, SAL의 결합인덱스 모습

 

-- 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 포맷

 

반응형