SQL Index 타지 않는 경우

백종하·2021년 5월 25일
0

DB

목록 보기
1/1
post-thumbnail

1. 인덱스에 변형을 가하는 경우

SELECT * FROM member WHERE CAST(input_datetime AS VARCHAR) = '2021-05-25'

위 SQL문 같이 컬럼을 변형하면 DBMS가 INDEX를 이용하지 않는다.

2. NOT 또는 IN 연산자 사용

NOT일 경우 무조건 인덱스를 타지 않는 것은 아니지만 일반적으로 NOT에 사용된 값이 아닌 데이터가 대부분 높은 비율을 차지하기 때문에 인덱스를 타지 않는 경우가 많다.
IN일 경우도 IN에 포함된 데이터들의 비율이 높다면 FULL SCAN을 하는 것이 낫다고 DBMS에서 판단하면 INDEX를 타지 않는다.

3. 와일드 카드 LIKE문장에서 범위를 전체 지정시

SELECT * FROM MEMBER WHERE name LIKE '%길동';

문자열로 이루어진 값을 INDEX로 잡았을 때 %가 앞쪽에 사용되면 정렬 순서를 사용할 수 없으므로 테이블 FULL SCAN이 이루어진다.

4. 복합 컬럼 INDEX에서 조건이 잘못되어 INDEX가 적용되지 못하는 경우

SELECT * FROM member where seq = 1 OR name = '홍길동'

seq와 name 둘 다 INDEX가 걸려있는 경우라도 DBMS가 최적의 OR 조건을 뽑기 힘들어 FULL SCAN을 하는 경우가 많다.

5. Optimizer의 선택

SELECT * FROM member WHERE id = 'kildong' and name = '홍길동'

INDEX가 id와 name 2개 있을 경우 id나 name INDEX 중 하나가 선택될 수도 있고 둘 다 선택될 수도 있다.

실행계획을 확인하여 원하는 결과가 나오도록 관리하는 것이 필요하다.

출처: https://elky.tistory.com/210

profile
이제 소용없다 기억력! 기록으로 남기자!

0개의 댓글