jae_cheol.log
로그인
jae_cheol.log
로그인
인덱스 확장기능 사용법
이재철
·
2021년 9월 11일
팔로우
0
Sql튜닝
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 Scan
Index 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
힌트 사용
이재철
Hi
팔로우
이전 포스트
인덱스 기본 사용법
다음 포스트
테이블 액세스 최소화
0개의 댓글
댓글 작성