본문 바로가기

프로그래밍/oracle

oracle - [오라클]인덱스 100% 활용하자

반응형

[오라클]인덱스 100% 활용하자

 


* 인덱스를 타지 않는 SQL

1. 인덱스 컬럼 절의 변형

2. 내부적인 데이터 변환

3. NULL 조건의 사용

4. 부정형 조건의 사용

5. LIKE 연산자 사용

6. 최적기가 판단


1 - 인덱스 컬럼 절의 변형

SQL> select ename from emp where sal * 2.1 > 950 --인덱스 사용불가

SQL> select ename from emp where sal > 950 /2.1  --인덱스 사용가능

SQL> select ename from emp where to_char(hiredate,'DDMMYY') = '250884' --인덱스 사용불가

SQL> select ename from emp where hiredate = to_date('250884','DDMMYY') --인덱스 사용가능


-> 인덱스 컬럼에 변형을 가하면은 사용할수 없습니다. 단 변형 가능하더라도 쓰고 싶다면은

    말리지는 않겠지만 create index .... on emp to_char(hiredate,'DDMMYY') 이렇게 하시면 

    됩니다.


2 - 내부적인 데이터 변환

SQL> select * from emp where hiredate ='14-JAN-85' --인덱스 사용불가

SQL> select * from emp hiredate = to_date('71-10-22','YY/DD/DD') --인덱스 사용가능

SQL> select * from emp where empno = '7936' --인덱스 사용불가

SQL> select * from emp where empno = to_number('7936') --인덱스 사용가능


-> 내부적인 데이터변환에서 가장 많이 실수하는 부분은 문자값 데이터타입을 갖는 컬럼에

    '값' -> 값 이렇게 하시는분이 많습니다. 딱맞는 데이터타입을 주세요 ^_^


3 - NULL 조건의 사용

SQL> select ename from emp where comm is null --인덱스 사용불가

SQL> select ename from emp where comm is not null --인덱스 사용가능

SQL> select ename from emp where ename > '' --인덱스 사용가능

SQL> select ename from emp where comm >= 0 --인덱스 사용가능


-> NULL조건으로 검색한다는 가정하에는 거의 인덱스 풀 스캔이 일어나겠죠. 적절히 사용합씨다.


4 - 부정형 조건의 사용

SQL> select ename from emp where deptno != 30 --인덱스 사용불가

SQL> select ename from emp where deptno < 30 and deptno > 30 --인덱스 사용가능


-> 논리적으로 부정형을 이용하여 인덱스를 사용하겠다는것은 말이 안되죠...

    이 쿼리문도 적절히 사용합씨다.


5 - Like 연산자 사용

SQL> select * from emp where ename like 'S%' --인덱스 사용가능

SQL> select * from emp where ename like '%S%' --인덱스 사용불가


-> %S% 부분을 꼭 쓰고싶다면은 이렇게 하세요 앞에부분을 다 넣는거죠. AS%, BS%...

    요즘 홈피를 보면 본문 찾기는 거의 없어져가고 있죠. 엔코아 경우 주제어를 검색을..


6 - 최적기가 판단


-> RBO경우 무조건 타죠 있으면은 이눔은 워낙 법을 좋아해서리..CBO는 통계값을 기준으로

    하기 때문에 DBA가 잘 해야겠죠. 그럼 우리가 판단하게 할라면은 HINT를 써서 이눔들을

    인도해야죠... 오늘도 전도를 ^____^ 



마지막으로 인덱스를 이용한 sort 회피 방법에 대해서 알아보겠습니다.

SQL> select empno, ename, job, comm from emp order by empno --sort 정렬

SQL> select empno, ename, job, comm frmo emp where empno >= 0 --sort 정렬제거


-> 인덱스는 값이 정렬되어 들어가있는 구조이기 때문에 처음부터 작은값 맨 끝값은

    최대값이 있겠죠. 잘 사용하면 최고의 튜닝이 되겠죠.


 

 


반응형