인덱스 확장기능 사용법

이재철·2021년 9월 11일
0

SQL

목록 보기
3/11

Index Range Scan

  • BTree 인덱스의 가장 일반적이고 정상적인 형태의 액세스 방식!
  • 인덱스 루트에서 리프 블록까지 수직적으로 탐색한 후에 필요한 범위만 스캔
  • 성능은 인덱스 스캔 범위, 테이블 액세스 횟수를 얼마나 줄일 수 있느냐로 결정됨.

Index Full Scan

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

Index Full Scan의 효용성

  • 인덱스 스캔 단계에서 대부분 레코드를 필터링하고 아주 일부만 테이블을 액세스하는 상황이라면
    면적이 큰 테이블보다 인덱스를 스캔하는 쪽이 유리

인덱스를 이용한 소트 연산 생략

  • 인덱스 컬럼 순으로 정렬
  • Sort Ordey By 연산을 생략할 목적으로 사용
  • FIRST_ROW는 일단 처음 결과가 빠르게 나오게 하라는 의미(집합 함수를 사용하면 무시됨.)
  • FIRST_ROW 힌트로 옵티마이저 모드를 바꾸면
    소트 연산을 생략함으로써 전체 집합 중 처음 일부를 빠르게 출력
  • 이 선택은 부분 범위 처리가 가능한 상황에서 극적인 성능 개선 효과를 가져다 줌.
  • (주의) 사용자가 처음 의도와 달리 fetch를 멈추지 않고 데이터를 끝까지 읽는 다면 Table Full Scan보다 훨씬 더 많은 I/O를 일으키고 결과적으로 수행 속도도 훨씬 느려진다.

Index Unique Scan

  • 수직적 탐색만으로 데이터를 찾는 스캔 방식
  • Unique 인덱스를 '=' 조건으로 탐색하는 경우에 작동
  • Unique 인덱스가 존재하는 컬럼은 중복 값이 입력되지 않기 때문

Index Skip Scan

  • 오라클은 인덱스 선두 컬럼이 조건절에 없어도 인덱스를 활용하는 새로운 스캔 방식을 9i 버전에 선보임
  • 조건절에 빠진 인덱스 선두 컬럼의 Distinct Value 개수가 적고 후행 컬럼의 Distinct Value 개수가 많을 때 유용
  • 이 스캔 방식을 유도하거나 방지할 때 index_ss, no_index_ss 힌트를 사용
  • 루트 또는 브랜치 블록에서 읽은 컬럼 값 정보를 이용해 조건절에 부합하는 레코드를 포함할 가능성이 있는 리프 블록만 골라서 액세스하는 스캔 방식

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

  • Distinct Value 개수가 적은 선두 컬럼이 조건절에 없고 후행 컬럼의 Distinct Value 개수가 많을 때 효과적
  • 선두 컬럼에 대한 조건절은 있고, 중간 컬럼에 대한 조건절이 없는 경우
  • 선두 컬럼이 부등호, BETWEEN, LIKE 같은 범위검색 조건일 때
  • 인덱스는 기본적으로 최적의 Index Range Scan을 목표로 설계해야 함
  • 수행 횟수가 적은 SQL을 위해 인덱스를 추가하는 것이 비효율적일 때
    Index Skip Scan을 차선책으로 활용하는 전략이 바람직

Index Fast Full Scan

  • 논리적인 인덱스 트리 구조를 무시하고 인덱스 세그먼트 전체를 Multiblock I/O 방식으로 스캔
  • 힌트는 index_ffs, no_index_ffs
  • Multiblock I/O 방식을 사용하므로 디스크로 부터 대량의 인덱스를 블록을 읽어야할 때 큰 효과를 발휘
  • 속도는 빠르지만, 인덱스 리프 노드가 갖는 연결 리스트 구조를 무시한 채 데이터를 읽기 때문에 정렬 X
  • 쿼리에 사용한 컬럼이 모두 인덱스에 포함돼 있을 때만 사용 가능
  • 인덱스가 파티션 돼 있지 않더라도 병렬 쿼리가 가능한 것도 중요한 특징 중 하나
  • 별령 쿼리 시 Direct Path I/O 방식을 사용해서 속도가 더 빨라짐.
Index Full ScanIndex Fast Full Scan
1. 인덱스 구조를 따라 스캔
2. 결과 집합 순서 보장
3. Single Block I/O
4. 파티션 돼있지 않다면 병렬 스캔 불가
5. 인덱스에 포함되지 않는 컬럼 조회시에도 사용 가능
1. 세그먼트 전체를 스캔
2. 결과집합 순서 보장 안됨
3. Multiblock I/O
4. 병렬 스캔 가능
5. 인덱스에 포함된 컬럼으로만 조회할 때 사용 가능

Index Range Scan Descending

  • Index Range Scan과 기본적으로 동일한 스캔 방식
  • 인덱스를 뒤에서 부터 앞쪽으로 스캔하기 때문에 내림차순으로 정렬된 결과집합을 얻음
  • 인덱스를 거꾸로 읽지 않는다면 index_desc 힌트 사용

0개의 댓글