본문 바로가기
DB/SQLD & SQLP

[SQLP] 4장. 인덱스와 조인 - 인덱스 기본 원리

by JiGyeong 2019. 3. 18.

1. 인덱스 구조

원하는 데이터를 빨리 찾도록 돕는 목적

인덱스 깊이(Height)

루트에서 리프 블록까지의 거리

가. 인덱스 기본

  • 루트와 브랜치 블록 : 각 하위 노드들의 데이터 값 범위를 나타내는 키 값과 그 키 값에 해당하는 블록을 찾는 데 필요한 주소 정보를 가짐

  • 리프 블록 : 인덱스 키 값과 테이블 레코드를 찾아가는데 필요한 주소 정보(Row Id)를 가짐

  • 키값이 같을 때는 주소정보 (Row Id)순으로 정렬됨

  • 인덱스 구성 칼럼 중 하나라도 null 값이 아닌 레코드는 인덱스에 저장

나. 인덱스 탐색

  • 수평적 탐색 : 리프 블록에 저장된 레코드 끼리 연결된 순서에 따라 수평으로 스캔함

2. 다양한 인덱스 스캔 방식

가. Index Range Scan

루트 블록에서 리프 블록까지 수직적으로 탐색한 후에 리프 블록을 필요한 범위만 스캔하는 방식

나. Index Full Scan

수직적 탐색없이 인덱스 리프 블록을 처음부터 끝까지 수평적으로 탐색하는 방식. 
최적의 인덱스가 없을 때 차선으로 선택.

다. Index Unique Scan

수직적 탐색만으로 데이터를 찾는 스캔 방식 
Unique 인덱스를 ‘=’ 조건으로 탐색하는 경우 사용

라. Index Skip Scan

  • 인덱스 선두 칼럼이 조건절에 빠졌어도 인덱스를 활용하는 새로운 스캔방식

  • 루트 또는 브랜치 블록에서 읽은 칼럼 값 정보를 이용해 조건에 부합하는 레코드를 포함할 “가능성이 있는” 하위 블록(브랜치 또는 리프 블록)만 골라서 액세스하는 방식

마. Index Fast Full Scan

인덱스 트리 구조를 무시하고 인덱스 세그먼트 전체를 Multiblock Read 방식으로 스캔

바. Index Range Scan Descending

Index Range Scan과 기본적으로 동일한 스캔 방식이나, 인덱스를 뒤에서부터 앞쪽으로 스캔하기 때문에 내림차순으로 정렬된 결과집합을 얻는다는 점만 다름

3. 인덱스 종류

가. B* Tree 인덱스

1) Unbalanced Index 
B*Tree 구조에서는 다른 리프 노드에 비해 루트 블록과의 거리가 더 먼 리프 노드가 있는 경우는 발생하지 않는다. 
즉, 루트로부터 모든 리프 블록까지의 높이가 동일.

2) Index Skew 
Index Skew는 인덱스 엔트리가 왼쪽 또는 오른쪽에 치우치는 현상을 말함 
예를 들어, 대량의 delete 작업을 마치고 나면 인덱스 왼쪽에 있는 리프 블록들은 텅 비는 반면 오른쪽은 꽉 찬 상태가 됨

3) Index Sparse 
블록 전반에 걸쳐 밀도(Density)가 떨어지는 현상

4) 인덱스 재생성 
인덱스의 주기적인 재생성 작업은 아래와 같이 예상효과가 확실할 때만 시행하는 것이 바람직함

  • 인덱스 분할에 의한 경합이 현저히 높을 때

  • 자주 사용되는 인덱스 스캔 효율을 높이고자 할 때. 특히 NL Join에서 반복 액세스되는 인덱스 높이(height)가 증가했을 때

  • 대량의 delete 작업을 수행한 이후 다시 레코드가 입력되기까지 오랜 기간이 소요될 때

  • 총 레코드 수가 일정한데도 인덱스가 계속 커질 때

나. 비트맵 인덱스

  • Distinct Value 개수가 적을 때 비트맵 인덱스를 사용하면 저장 효율이 좋음

  • B*Tree 인덱스보다 훨씬 적은 용량을 차지하므로 인덱스가 여러 개 필요한 대용량 테이블에 유용

  • 다양한 분석관점(Dimension)을 가진 팩트성 테이블이 주로 여기에 속함

  • 반대로 Distinct Value가 아주 많은 칼럼이면 오히려 B*Tree 인덱스보다 많은 공간을 차지함

  • Distinct Value 개수가 적은 칼럼일 때 저장효율이 좋지만 테이블 Random 액세스 발생 측면에서는 B*Tree 인덱스와 똑같기 때문에 그런 칼럼을 비트맵 인덱스로 검색하면 그다지 좋은 성능을 기대하기 어려움

다. 함수기반 인덱스

칼럼 값 자체가 아닌, 칼럼에 특정 함수를 적용한 값으로 B*Tree 인덱스를 만듬 
예를 들어, 대소문자를 구분해서 입력 받은 데이터를 대소문자 구분 없이 조회할 때다. upper(칼럼명) 함수를 씌워 인덱스를 생성하고 upper(칼럼명) 조건으로 검색하는 것이다.

라. 리버스 키 인덱스

입력된 키 값을 거꾸로 변환해서 저장하는 인덱스 
예를 들어 , 일련번호나 주문일시 같은 칼럼에 인덱스를 만들면, 입력되는 값이 순차적으로 증가하기 때문에 가장 오른쪽 인덱스에만 데이터가 쌓임

마. 클러스터 인덱스

클러스터 키(예로 deptno) 값이 같은 레코드가 한 블록에 모이도록 저장하는 구조를 사용한다. 한 블록에 모두 담을 수 없을 때는 새로운 블록을 할당해 클러스터 체인으로 연결

[그림 클러스터 인덱스]


바. 클러스터형 인덱스/IOT

  • 클러스터형 인덱스도 구조적으로는 B*Tree 인덱스와 같은 형태, 차이가 있다면 별도의 테이블을 생성하지 않고 모든 행 데이터를 인덱스 리프 페이지에 저장한다는 점