간단명료

2.3 인덱스 확장기능 사용법 본문

친절한 SQL 튜닝/2장. 인덱스 기본

2.3 인덱스 확장기능 사용법

FeelGoood 2022. 2. 23. 21:05

2.3.1 Index Range Scan

B-Tree 인덱스의 가장 일반적이고 정상적인 형태의 액세스 방식. 선두 컬럼을 가공하지 않은 상태로 조건절에 사용한다면 무조건 Index Range Scan 한다. 성능은 인덱스 스캔 범위, 테이블 액세스 횟수를 얼마나 줄일 수 있느냐로 결정된다.


2.3.2 Index Full Scan

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

Inex Full Scan의 효용성

인덱스를 레인지 스캔할 수 없을 때 대용량 테이블이어서 Table Full Scan하기에 부담이 크다면 옵티마이저는 Index Full Scan 방식을 선택한다.
인덱스를 Full Scan 하면 Range Scan과 마찬가지로 결과집합이 인덱스 컬럼 순으로 정렬된다. 따라서 Sort Order By 연산을 생략할 목적으로 사용할 수 있다. Index Full Scan 이 Table Full Scan 보다 비효율적일때도 옵티마이저가 Index Full Scan 방식을 선택할 때가 있는데, first_rows 힌트 사용한 경우처럼 정렬이 필요한 경우 Index Full Scan 방식을 선택하여 정렬을 생략한다.(하지만 해당 결과가 속도에 영향을 줄 수 있다.)


2.3.3 Index Unique Scan

수직적 탐색만으로 데이터를 찾는 스캔 방식으로서, Unique 인덱스 를 '='조건으로 탐색하는 경우에 작동한다. 당연히 Unique 결합 인덱스에 대해 일부 컬럼만으로 검색할 때는 Index Range Scan을 한다.


2.3.4 Index Skip Scan

인덱스 선두 컬럼을 조건절에 사용하지 않으면 옵티마이저는 기본적으로 Table Full Scan 을 선택한다. 하지만 I/O를 줄일 수 있거나 정렬된 결과를 쉽게 얻을 수 있다면 Index Full Scan 을 사용하기도 한다.
Index Skip Scan 은 조건절에 빠진 인덱스 선두 컬럼의 Distnct Value 개수가 적고 후행 컬럼의 Distinct Value 개수가 많을 때 유용하다. (예를들어 고객 테이블에서 Distinct Value 개수가 적은 컬럼은 '성별'이고 많은 컬럼은 '고객번호'다.)
Index Skip Scan 방식을 유도하고자할 때는 index_ss 힌트를 사용한다. Index Skip Scan은 루트 또는 브랜치 블록에서 읽은 컬럼 값 정보를 이용해 조건절에 부합하는 레코드를 포함하는 '가능성이 있는' 리프 블록만 골라서 액세스하는 방식이다.
(예시는 118 page 참고)

Index Skip Scan이 작동하기 위한 조건

Distinct Value 개수가 적은 선두 컬럼이 조건절에 없고 후행 컬럼의 Distinct Value 개수가 많을 때 효과적이지만, 선두컬럼이 없을 때만 작동하는 것이 아니다. 결합 인덱스의 선두 컬럼에 대한 조건절은 있고 중간 컬럼에 대한 조건절이 없는 경우에도 사용할 수 있다.
Distinct Value가 적은 두 개의 선두컬럼이 모두 조건절에 없는 경우에도 유용하게 사용할 수 있다.
BETWEEN, LIKE 같은 범위 검색 조건일 때도 사용할 수 있다.
(120 page 참고)


2.3.5 Index Fast Full Scan

Index Fast Full Scan 은 Index Full Scan보다 빠르다. 논리적인 인덱스 트리 구조를 무시하고 인덱스 세그먼트 전체를 Multiblock I/O 방식으로 스캔하기 때문이다. 관련 힌트는 index_ffs와 no_index_ffs 다.(122 page 참고)

  > 논리적 순서로 배치한 블록들.(루트-1번브랜치-1-2-3-4-5-6-7-8-9-10 순)

  > 물리적 순서로 배치했지만 논리적 순서를 화살표로 표시.(왼쪽 익스텐트에서 1-2-10-3-9, 오른쪽 익스텐트에서 8-7-4-5-6 순) 루트와 브랜치 블록도 읽지만 필요 없는 블록이므로 버린다.

Index Fast Full Scan은 Multiblock I/O 방식을 사용하므로 디스크로부터 대량의 인덱스 블록을 읽어야 할 때 큰 효과를 발휘한다.
논리적인 인덱스 트리를 무시하기 때문에 결과집합이 인덱스 키 순서대로 정렬되지 않는다.
쿼리에 사용한 컬럼이 모두 인덱스에 포함돼 있을 때만 사용할 수 있다.

Index Full Scan Index Fast Full Scan
-1. 인덱스 구조를 따라 스캔 -1. 세그먼트 전체를 스캔
-2. 결과집합 순서 보장 -2. 결과집합 순서 보장 안됨
-3. Single BLock I/O -3. Multiblock I/O
-4. (파티션이 돼 있지 않다면) 병렬스캔 불가 -4. 병렬스캔 가능
-5. 인덱스에 포함되지 않은 컬럼 조회 시에도 사용 가능 -5. 인덱스에 포함된 컬럼으로만 조회할 때 사용 가능

2.3.6 Index Range Scan Descending

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

728x90
반응형

'친절한 SQL 튜닝 > 2장. 인덱스 기본' 카테고리의 다른 글

2.2 인덱스 기본 사용법  (0) 2022.02.22
2.1 인덱스 구조 및 탐색  (0) 2022.02.22
Comments