본문 바로가기

Oracle/SQL

SQL 단일행 함수 -변환함수 (to_number) , 암시적 형 변환

TO_NUMBER (숫자형으로 변환)

만약, sal(월급) 컬럼이 to_char 인 문자형으로 되어있다면? 

select ename, sal

from emp

where sal = 3000 ; 

을 출력한다면 오라클의 암시적 형변환으로 인해 출력은 된다. 

하지만 제대로된 오라클의 성능을 위해서는 

select ename sal,

from emp

where to_number(sal) = 3000; 

이렇게 sal 을 숫자형으로 바꾸어서 출력해 주어야한다

- 지금의 예시는 설명을 위한 예시일뿐 컬럼에 가공(tom_number으로 ) 을 하는 식은 좋지 않다. 

암시적 형 변환

다음의 식은  SAl이 숫자형이다. 

select ename, sal

from emp

where sal = '3000';

설명 : where 절에 3000은 숫자여서 원래는 '싱클 쿼테이션 마크'가 없어야하는데 붙어있다. (문자형취급된다)

하지만 오라클에서 알아서 암시적으로 형을 숫자로 변환해 주어서 오류없이 코딩이 출력 되었다 .

만약에 이런 문장이 많아져서 암시적 형 변환이 많아 진다면 코딩 속도가 느려진다.

→ 개선 후

select ename, sal

from emp

where sal = 3000;

예제

select ename, sal

from emp

where sal like '30%';

설명 :

될까? where 절에 sal 은 숫자형 이고  '30%'은 문자형이다..

근데 사실 코딩해보면 실행이 된다.

이유는 오라클에서 내부적으로 sal 을 숫자에서 —> 문자형으로 암시적형 변환을 해 주었기 때문에

또, like 는 왼쪽에 문자형 컬럼을 사용해 주어야한다 (sal은 숫자형 컬럼..)

만약 like 를 자주 사용하는 SQL 의 컬럼은 처음 테이블 생성할 때 부터 숫자형이 아니라 문자형으로 생성해 주어야한다.

원래 맞는 식은

where to_char(sal) like '30%' ;

→자체적으로 sal 을 to_char 를 사용하여 문자형으로 바꾸어 주어야 성능이 좋아진다.

암시적 형 변환이 많이 일어나게 되면 현업에서는 너무 느리게 실행이 된다 (빅데이터 이기 때문에)

오라클에서 어떻게 자체적으로 변환하여 실행 했는지 볼수있는 쿼리

→(SQL 의 실행계획을 확인하는 방법)

explain plan for

select ename, sal

from emp

where sal like '30%';

select *

from table(dbms_xplan.display);

→ 이 SQL 을 어떻게 실행했는지에 대한 계획이 나온다


튜닝 : 오라클 검색속도를 높이는 것

튜닝순서

(1) 오라클이 어떤 계획으로 실행을 했는지 계획을 확인한다.

(2) 마지막에 오라클이 암시적 형 변환을 시킨 문장을 본다.

(3) 암시적 형 변환이 이루어진 문장을 수정시켜준다.


응용 문제 : 직업이 세일즈맨, 애널리스트 인사원들 이름,월급, 직업 출력 ,월급을 출력할때 천단위 나오게 하고, 월급이 높은 사원부터 출력

select ename, to_char(sal, '999,999'), job

from emp

where job in ('SALESMAN','ANALYST')

order by sal desc;