본문 바로가기
개발공부 일지/오라클

암시적 오라클 형 변환 우선순위

by Box Cat 2023. 6. 19.
728x90
반응형

형 변화에는 2가지가 있습니다.

(1)명시적 형변환

: 사용자가 TO_CHAR(), TO_DATE()와 같은 메서드를 활용하여 직접 형 변환하는 것.

 

(2)암시적 형변환(=묵시적 형변환)

: 사용자가 직접 형 변환하지 않고, 옵티마이저가 자체적으로 판단하여 인덱스 칼럼과 조건절에 쓰인 값의 자료형이 다르면 한 쪽을 자료형 변환해서 다른 쪽이랑 맞추도록 형 변환하는 것.

 

 

명시적 형변환이 가장 높은 우선 순위를 지닙니다. 그 다음에 암시적 형변환이 뒤따르는 데, 암시적 형변환에도 우선 순위가 있습니다.

 

묵시적 형변환 우선 순위

  1. Datetime and interval datatypes
  2. BINARY_DOUBLE
  3. BINARY_FLOAT
  4. NUMBER
  5. Character datatypes
  6. 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)

로 명시적 형 변환을 해야 합니다.

 

 


 
728x90
반응형

댓글