Database

인덱스를 타지 않는 경우

Jack Moon 2012. 10. 8. 15:34

인덱스를 타지 않는 경우

출처 : http://kin.naver.com/knowhow/detail.nhn?docId=210335 

대용량 DB에서 가장 크게 쿼리 속도를 좌우하는 것이 인덱스 입니다.

인덱스를 타지 않는 쿼리문에 대해 잘 나와 있는 자료 입니다.   

 

 

  • 인덱스를 타지 않는 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 정렬제거

 

 

'Database' 카테고리의 다른 글

Oracle 에러  (0) 2012.10.08
Oracle 복구  (0) 2012.10.08
Oracle 백업  (0) 2012.10.08
Oracle - PHP 연동 샘플  (0) 2012.10.08
MySQL 패스워드 변천사  (0) 2012.10.08