오늘 학습할 내용은 Index 기본 사용법 몇 가지에 대해서 살펴볼 계획.
2.3 💡 인덱스 확장 기능 사용법
첫 번쨰로 학습할 내용은 Index Range Scan이다.
2.3.1. ✍️ Index Range Scan
B Tree 인덱스의 가장 일반적이고 정상적인 형태의 액세스 방식이다.
인덱스 루트에서 리프 블록까지 수직적으로 탐색한 이후, 필요한 범위만 스캔한다.단, 인덱스를 Range Scan하려면 선두 컬럼을 가공하지 않은 상태로 조건 절에 사용해야 한다.
2.3.2. ✍️ Index Full Scan
수직적 탐색없이 인덱스 리프 블록을 처음부터 끝까지 수평적으로 탐색하는 방식
Index Full Scan은 대개 데이터 검색을 위한 최적의 인덱스가 없을 때 차선으로 선택된다.
데이터 저장 공간은 가로x세로 즉, 컬럼 길이 x 레코드 수에 의해 결정되므로 인덱스가 차지하는 면적은 테이블보다 훨씬 적다.
만약 인덱스 스캔 단계에서 대부분 레코드를 필터링하고 아주 일부만 테이블을 액세스하는 상황이라면 면적이 큰 테이블보다 인덱스를 스캔하는 쪽이 유리하다.
-> 그럴 때 옵티마이저는 Index Full Scan 방식을 선택한다.2.3.3. ✍️ Index Unique Scan
수직적 탐색으로만 데이터를 찾는 스캔 방식으로서 Unique 인덱스를 '=' 조건으로 탐색하는 경우에 작동한다.
2.3.4. ✍️ Index Skip Scan
인덱스 선두 컬럼을 조건절에 사용하지 않으면 옵티마이저는 기본적으로 Table Full Scan을 선택한다. Table Full Scan보다 I/O를 줄일 수 있거나 정렬된 결과를 쉽게 얻을 수 있다면 Index Full Scan을 사용하기도 한다.
이 스캔 방식은 조건절에 빠진 인덱스 선두 컬럼의 Distinct Value 개수가 적고 후행 컬럼의 Distinct Value 개수가 많을 때 유용하다.
ex) Distinct Value가 적은 컬럼은 성별, 많은 컬럼은 고객 ID 등이다.
2.3.5. ✍️ Index Fast Full Scan
기존 Index Full Scan보다 빠른 이유는 논리적인 인덱스 트리 구조를 무시하고 인덱스 세그먼트 전체를 Multi Block I/O방식으로 스캔하기 때문이다.
Index Full Scan과의 차이점은 다음과 같다.
- Index Full Scan
- 인덱스 구조를 따라 스캔
- 결과집합 순서 보장
- Single Block I/O
- (파티션 돼 있지 않다면) 병렬 스캔 불가
- 인덱스에 포함되지 않은 컬럼 조회 시에도 사용 가능
- Index Fast Full Scan
- 세그먼트 전체를 스캔
- 결과집합 순서 보장 안 됨
- Multi Block I/O
- 병렬 스캔 가능
- 인덱스에 포함된 컬럼으로만 조회할 때 사용 가능
2.3.6. ✍️ Index Range Scan Descending
Index Range Scan과 동일한 스캔 방식으로 인덱스 루트에서 리프 블록까지 수직적으로 탐색하고 필요한 범위만 스캔하되, 인덱스를 뒤에서부터 앞쪽으로 스캔하기 때문에 내림차순으로 정렬된 결과 집합을 얻는다.