일단 6가지 정도의 케이스로 분류해 보겠습니다.

1. 인덱스 컬럼절의 변형

2. 내부적인 데이터 변환

3. NULL 조건의 사용

4. 부정형 조건의 사용

5. LIKE 연산자 사용

6. 최적기가 판단

 

한개씩 살펴보면

 

1. 인덱스 컬럼절의 변형

 

select ename from emp where sal * 2.1 > 950 (X)

select ename from emp where sal > 950/2.1   (O)

 

select ename from emp where to_char(hiredate, 'DDMMYY') = '250884'   (X)

select ename from emp where hiredate = to_date('250884', 'DDMMYY')    (O)

 

=> 인덱스 컬럼에 변형을 가하면 사용할 수 없습니다. 단 변형이 가능하더라도 쓸 수는 있지만

    create index .... on emp to_char(hiredate, 'DDMMYY') ....이렇게까지 쓰진 않습니다.

 

2. 내부적인 데이터변환

 

select * from emp where hiredate = '14-JAN-85' (X)

select * from emp hiredate = to_date('71-10-22', 'YY/DD/MM')   (O)

 

select * from emp where empno = '7936' (X)

select * from emp where empno = to_numer('7936')                   (O)

 

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

     유형입니다. 딱 맞는 데이터타입을 사용해야만 합니다.

 

3. NULL 조건의 사용

 

select ename from emp where comm is null          (X)

select ename from emp where comm is not null    (X)

 

select ename from emp where ename > ''            (O)

select ename from emp where comm >= 0            (O)

 

=> NULL 조건으로 검색한다는 가정하에는 거의 인덱스 풀 스캔이 일어납니다. 적절히 사용해야합니다.

 

4. 부정형 조건의 사용

 

select ename from emp where deptno != 30 (X)

select ename from emp wehre deptno < 30 and deptno > 30      (O)

 

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


5. Like 연산자 사용

 

select * from emp where ename like 'S%'         (O)

select * from emp where ename like '%S%'      (X)

 

=> AS%, BS%, ..... 본문찾기 기능은 없어지는 추세입니다.

 

6. 최적기가 판단

 

RBO경우 무조건 탑니다. CBO는 통계값을 기준으로 하기 때문에 DBA가 잘해야하죠..

 

 

기타. 인덱스를 이용한 sort 회피 방법

 

select empno, ename, job, comm from emp order by empno             (정렬)

select empno, ename, job, comm from emp where empno >= 0         (정렬제거)

 

인덱스는 값이 정렬되어 들어가 있는 구조이기 때문에 처음부터 작은값 맨 끝값은 최대값이 있겠죠.

Posted by 준콩ol 준콩ol

댓글을 달아 주세요