옵티마이저가 수행하는 자동 형변환 때문에 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를 줄이는 것임
- 형변환 함수를 생략한다고 연산 횟수가 줄어드는 것도 아님
(개발자가 형 변환 함수를 생략해도 옵티마이저가 자동으로 형 변환함)
'DATABASE > 튜닝' 카테고리의 다른 글
[SQL 튜닝] 파티션 (0) | 2020.07.15 |
---|---|
[SQL 튜닝] 테이블 랜덤 액세스, ROWID, 인덱스 손익분기점 (0) | 2020.06.29 |
[SQL 튜닝] 인덱스를 이용한 소트 연산 (0) | 2020.06.22 |
[SQL 튜닝] 인덱스 기본 사용법 (0) | 2020.06.15 |
[SQL 튜닝] 인덱스 구조 및 탐색 (0) | 2020.06.15 |