옵티마이저가 수행하는 자동 형변환 때문에 Index Range Scan을 못할 수 있음

SELECT *
FROM 고객
WHERE 생년월일 = 19930109
SELECT *
FROM 고객
WHERE TO_NUMBER(생년월일) = 19930109

- 첫번째 쿼리는 옵티마이저에 의해 두번째 쿼리로 수행됨

- 생년월일 컬럼은 문자형인데, WHERE절의 비교 값을 숫자인 19930109로 작성하여 문자형 인덱스 칼럼인 생년월일이 숫자형으로 가공되어서 Index Range Scan을 못함

- 오라클에서 숫자형과 문자형이 만나면 숫자형이 이김 → 문자형이 TO_NUMBER로 자동 형변환됨

 

SELECT *
FROM 고객
WHERE 가입일자 = '01-JAN-1993'

- 날짜형과 문자형이 만나면 날짜형이 이기므로 비교 값이 날짜형으로 변환되므로 Index Range Scan이 가능

 

SELECT *
FROM 고객
WHERE 고객번호 LIKE '9874%'
SELECT *
FROM 고객
WHERE TO_CHAR(고객번호) LIKE '9874%'

- 숫자형과 문자형이 만나면 숫자형이 이긴다고 했지만, LIKE연산에서는 다름

- LIKE는 문자형 연산자이기 때문에 이 경우에는 숫자형이 문자형으로 형 변환됨

- 숫자형 인덱스 칼럼 고객번호가 형변환되어 Index Range Scan 불가

 

- 옵티마이저의 형변환 기능에 의존하지 말고, 인덱스 컬럼 기준으로  WHERE절에서 반대편 컬럼 또는 값을 정확하게 명시적으로 형 변환해주기

- 형변환 함수를 사용하면 연산수가 늘어서 성능이 안 좋아질 거라 생각할 수 있지만, SQL의 성능은 그런 것에서 결정되지 않고 블록 I/O를 줄이는 것임

- 형변환 함수를 생략한다고 연산 횟수가 줄어드는 것도 아님

(개발자가 형 변환 함수를 생략해도 옵티마이저가 자동으로 형 변환함)