insert into emp(empno, ename, sal) values (1111,' jack ',3000);
create index emp_ename on emp(ename);

튜닝전:

select ename, sal
from emp
where trim(ename)='jack'

select  * from  table(dbms_xplan.display_cursor(null, null, 'ALLSTATS LAST'))
;

튜닝 후

create  index  emp_ename_func
              on  emp(trim(ename));
select ename, sal
from emp
where trim(ename)='jack';

select  * from  table(dbms_xplan.display_cursor(null, null, 'ALLSTATS LAST'))
;

문제 12. 아래의 sql을 튜닝하시오! (sqlp 전문가 시험 출제 문제)

튜닝 전

--환경구성
@demo
create index emp_ename on emp(ename);
select ename, sal
from emp
where ename like '%EN%' or ename like '%IN%';

select  * from  table(dbms_xplan.display_cursor(null, null, 'ALLSTATS LAST'))
;

설명: 와일드카드(%)가 앞에 있으면 무조건 full table scan입니다.

튜닝 후

select ename, sal
from emp
where  regexp_like (ename,'(EN|IN)');

튜닝 후

 create  index  emp_ename_reg
              on  emp regexp_like( ename, '(EN|IN)') ;
            
select  /*+ index(emp emp_ename_reg) */ ename, sal
              from  emp
              where  regexp_like( ename, '(EN|IN)' );
        
select * from  table(dbms_xplan.display_cursor(null, null, 'ALLSTATS LAST'));
 

설명: 정규 표현식 함수로는 함수 기반 인덱스를 생성할 수 없습니다. 위와 같이 중간 데이터를 검색하는 sql튜닝방법은 뒤에서 튜닝합니다.