ABOUT ME

-

Today
-
Yesterday
-
Total
-

  • [mssql] 인덱스를 타지 않는 SQL
    프로그래밍 2013.04.24 11:07

    업을 하다보면 초기에는 데이터가 별로 없어서 속도차이를 느끼지 못하지만 나중에 시간이 흐르고 데이터가 쌓이게되면 쿼리의 속도가 이슈가 됩니다.
     
    처음에 쿼리 작성시 기본 상식 정도는 알고 있는게 도움이 될거같아서 여기저기서 얻은 정보를 바탕으로 끄적여봅니다.
     

    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%' --인덱스 사용불가

     

    + 추가 - NOT IN, NOT EXISTS, MINUS 부분은 인덱스를 타지 못하고 FTS(Full Table Scan)을 사용합니다.


     

    댓글 1

    • 프로필사진

      조회조건에 IS NULL, IS NOT NULL로 조회조건을 주고 실행계획을 봤는데 인덱스를 타는거 같은데
      혹시 제가 놓치고 있는 부분이 있을까요?

      10만개의 데이터들중에 4만개가 null로 되어있습니다.

      2019.05.09 15:56
Designed by Tistory.