형 변화에는 2가지가 있습니다.
(1)명시적 형변환
: 사용자가 TO_CHAR(), TO_DATE()와 같은 메서드를 활용하여 직접 형 변환하는 것.
(2)암시적 형변환(=묵시적 형변환)
: 사용자가 직접 형 변환하지 않고, 옵티마이저가 자체적으로 판단하여 인덱스 칼럼과 조건절에 쓰인 값의 자료형이 다르면 한 쪽을 자료형 변환해서 다른 쪽이랑 맞추도록 형 변환하는 것.
명시적 형변환이 가장 높은 우선 순위를 지닙니다. 그 다음에 암시적 형변환이 뒤따르는 데, 암시적 형변환에도 우선 순위가 있습니다.
묵시적 형변환 우선 순위
- Datetime and interval datatypes
- BINARY_DOUBLE
- BINARY_FLOAT
- NUMBER
- Character datatypes
- All other built-in datatypes
암시적 형 변환의 문제점은 조건 절(WHERE)의 인덱스 컬럼(왼쪽 부분)이 변환되면 인덱스를 사용할 수 없다는 점입니다.
인덱스 컬럼 BIRTH_DATE 의 자료형이 NUMBER일 때, WHERE BIRTH_DATE = '20230211' 과 같은 조건절을 사용하면NUMBER 자료형이 문자열 자료형보다 우선 순위가 높으므로( TO_NUMBER() > TO_CHAR() ), 문자열이었던 ' 20230211 '이 숫자 20230211 으로 바뀝니다.
즉, WHERE BIRTH_DATE = TO_NUMBER('20230211')
와 같은 형태가 되고... 인덱스 컬럼(좌측 컬럼)에 변화가 없으므로 인덱스를 타게 됩니다.
하지만, 인덱스 컬럼의 자료형이 문자열이고 조건절이 WHERE BIRTH_DATE = 20230211 이라면
TO_NUMBER( BIRTH_DATE ) = 20230211
과 같은 변환이 일어나게 됩니다.
왜냐하면, TO_NUMBER()의 우선 순위가 TO_CHAR()보다 높기 때문에.. 문자열을 숫자로 바꾸게 되고, 좌변(인덱스 컬럼)이 문자 => 숫자로 변하게 됩니다. 결국,, 인덱스 컬럼에 변화가 생겨 인덱스를 사용할 수가 없게 됩니다.
따라서,
WHERE BIRTH_DATE = TO_CHAR(20230211)
로 명시적 형 변환을 해야 합니다.
'개발공부 일지 > 오라클' 카테고리의 다른 글
오라클)SELECT * FOR UPDATE (0) | 2023.09.30 |
---|---|
오라클)Ordered와 Leading 힌트 (0) | 2023.09.30 |
오라클)Nested Loop Join과 Hash Join과 선행 테이블 (0) | 2023.06.19 |
SORT MERGE JOIN과 인덱스 (0) | 2023.06.19 |
오라클)NVL2와 COALESCE 비교 (0) | 2023.06.19 |
댓글