Index Range Scan
- SQL 튜닝의 핵심 원리
- ⭐인덱스를 구성하는 선두 컬럼을 조건절에 사용
- 항상 빠른 속도를 보장하지는 않는다 ( 데이터 양이 많은 경우 )
- 인덱스 스캔하는 범위를 얼마나 줄일 수 있는지
- 테이블로 엑세스 하는 횟수를 얼만큼 줄일 수 있는지
인덱스 : 이름 + 부서코드
SELECT *
FROM 사원
WHERE 이름 = '홍길동'
Index Full Sacn
- 적당한 인덱스가 없는 경우 사용
- 조회 조건의 인덱스가 있으나, 선두 컬럼이 아니지만 옵티마이저가 인덱스 활용 시 이익이 있다고 판단할 경우 사용
⭐ 최종 결과 값이 적을 때 Index Full Scan이 효율적이며,
최종 결과 값이 많을 때 Full Table Scan이 효율적이다.
Index Unique Scan
- 수직적 스캔만 발생
- Unique 인덱스 일 경우 사용
- = 조건일 경우만 사용
- Unique 인덱스라도 해도 between이나 like,부등호로 검색할 때는 Index Range Scan으로 처리됨
- Unique 결합 인덱스에 대해 일부컬럼으로만 검색할 때도 Index Range Scan으로 처리됨
→ ex) 인덱스: 주문일자+고객ID+상품ID 인데 고객ID로만 검색하는 경우
Index Skip Scan
- 조회 조건이 인덱스 선두 컬럼이 아니며, 인덱스 선두 컬럼의 Distinct가 매우 낮을 때 사용.
- 인덱스 선두 컬럼이 Between , Lke , 부등호 일 때도 사용 가능
- Index Skip Scan을 유도할때 : index_ss / 방지할 때 : no_index_ss
Index Fast Scan
- 전체 Index를 Full Scan
- Multi - Block I/O
- 파라미터의 db_file_multiblock_read_count 개수( 통상적으로 128로 설정 )만큼 한번에 read
- Index를 논리적 순서와 무관하게 물리적 순서대로 Read
- 속도가 빠르다
- 결과는 인덱스 키 컬럼의 순서와 쿠관
Index Full Sacn | Index Fast Full Scan |
---|
인덱스 구조를 따라 스캔 | 세그먼트 전체를 스캔 |
결과집합 순서 보장 | 결과집합 순서 보장 안됨 |
Single Block I/O | Multi Block I/O |
병렬스캔 불가(파티션 시 가능) | 병렬스캔 가능 |
인덱스에 포함되자 않은 컬럼 조회 시에도 사용 가능 | 인덱스에 포함된 컬럼으로만 조회할 때 사용 사용 가능 |
인덱스 : c1 + c2
SELECT c1, c2, c3
FROM t1
WHERE c2 = 'A';
=> c3까지 조회하므로 index fast full scan 불가!
Index Range Scan Descending
- Index Range Scan과 기본적으로 동일하나, 인덱스를 뒤에서 부터 앞쪽으로 스캔하기 때문에 내림차순으로 정렬된 결과집합을 얻는다
- 유도 : index_desc
In-List Iterator