인덱스 기본 사용법
인덱스 기본 사용버은 Range Scan 하는 방법 의미.
인덱스를 정상적으로 사용한다의 의미는 리프 블록에서 스캔 시작점을 찾아 중간에 멈추는 것을 의미. 리프 블록 일부만 스캔하는 Index Range Scan
다만 시작점을 찾을 수 없고 멈출수도 없어 리프 블록 전체를 스캔해야하는 경우 Index Full Scan 방식
2.2.2 인덱스를 Range Scan 할 수 없는 이유
인덱스 컬럼을 가공했을 때 정상적을 사용할 수 없는 이유는 인덱스 스캔 시작점을 찾을 수 없기 때문
substr, nvl, like, or, in
다만 OR 또는 IN 조건절은 옵티마이저의 쿼리변환 기능을 통해 Range Scan으로 처기되기도 한다.
2.2.3 더 중요한 인덱스 사용조건
인덱스 구성을 [소속 + 사원명 + 나이]로 한 경우
where 사원명 = ‘홍길동’ 은 Ragne Scan이 불가능함.
소속이 다르면 서로 멀리 떨어져 있기 때문에, 리프 블록 전 구간에 흩어진다.
시작점을 찾을 수 없고 끝점을 알 수 없어 리프 블록 모두 스캔해야 한다.
인덱스를 Range Scan 하기 위해 첫 번째 조건은 인덱스 선두 컬렘이 조건절에 있어야 한다.
중간에 substr 이 들어간 경우에도 Range Scan 이 불가능함 인덱스 선두 컬림이 가공되지 않은 상태로 조건절에 있어야 Range Scan이 가능
2.2.4 인덱스 소트 연산 생략
인덱스를 Range Scan 할수 있는 이유는 데이터가 정렬되어있기 때문.
데이터가 정렬되어 있기 떄문에 인덱스 구성한 순으로 조회하는 경우 정렬되어 출력된다. 이런 속성 때문에 SQL 문에 ORDER BY 가 있더라도 옵티마저는 따로 정렬 연산을 수행하지 않는다.
DESCENDING 경우에도 RANGE SCAN DESCENDING 이 사용되어 정렬 연산 수행 하지 않음
2.7.7 자동 형변환
컬럼이 문자형인 경우 숫자형과 비교하게되면
TO_NUMBER 형변환 되어 옵티마이저는 인덱스 스캔이 불가능하다
숫자형 > 문자형
날짜형 > 문자형
다만 like 경우 문자형 기준으로 숫자형이 형 변환 된다.
decode(a, b, c, d) 처리할 때, c 인자 값에 의해 결정 됨
c 가 문자형인 경우 d가 숫자형이면 d는 문자형으로 형 변환 된다.
null값인 경우 varchar2로 취급
to_number로 대신 형 변환 해주면 오류를 피할 수 있다.
decode(a, b, to_number(c), d)
TO_CHAR, TO_NUMBER, TO_DATE 등 성능을 위해 의도적으로 생략하는 경우가 있는데, SQL성능은 블록 I/O 를 줄일수 있느냐 없느냐에서 결정되기 떄문에 형변환 생략해도 연산횟수가 주는것이 아니다