개발자꿈나무
Index를 타지 않는 쿼리 본문
1. SQL문을 사용할 때 인덱스 컬럼을 변형하게 되면 데이터베이스가 인덱스를 사용하지 않는 경우가 발생
SELECT * FROM table WHERE age + 10 = 30 //인덱스 사용불가
SELECT * FROM table WHERE abe = 20 + 10 //인덱스 사용가능
2. NULL조건을 사용하면 FULL TABLE SCAN 발생
SELECT * FROM table WHERE age IS NULL //인덱스 사용불가
SELECT * FROM table WHERE age > 0 //인덱스 사용가능
3. NOT을 사용하게 되면 일반적으로 NOT에 사용된 값이 아닌 데이터일 비율이 높아 인덱스를 타지 않는 경우 발생
SELECT * FROM table WHERE age != 30 //인덱스 사용불가
SELECT * FROM table WHERE age < 30 AND age > 30 //인덱스 사용가능
4. LIKE문을 사용할 때 %가 앞에 붙을 때는 인덱스를 타지 않는 경우 발생
SELECT * FROM table WHERE name LIKE '%KIM%' //인덱스 사용불가
SELECT * FROM table WHERE name LIKE 'KIM%' //인덱스 사용가능
5. IN에 포함된 데이터의 비율이 매우 높아 FULL TABLE SCAN을 하는 것이 낫다고 판단하면 인덱스를 타지 않는 경우 발생
SELECT * FROM table WHER age IN (19, 20, 21)
6. 복합인덱스(name, age)에서 name, age 순서를 따르지 않을 때 인덱스를 타지 않는 경우 발생
SELECT * FROM table WHERE age = 30 //인덱스 사용불가
SELECT * FROM table WHERE name = 'KIM' AND age = 30 //인덱스 사용가능
7. 인덱스 컬럼의 내부적인 데이터 변환을 하게되면 인덱스를 타지 않는 경우 발생
SELECT * FROM table WHERE age = '30' //인덱스 사용불가
SELECT * FROM table WHERE age = to_number('30') //인덱스 사용가능
Q. 다음과 같이 인덱스가 생성되어 있을 때, 생성된 인덱스가 사용되기에 가장 적절하지 않은 질의는?
CREATE INDEX EmpIndex ON EMPLOYEE (dno, salary);
1. SELECT * FROM EMPLOYEE WHERE salary = 5000000;
2. SELECT * FROM EMPLOYEE WHERE dno = 3 AND salary = 5000000;
3. SELECT * FROM EMPLOYEE WHERE dno = 2;
4. SELECT * FROM EMPLOYEE WHERE dno >= 2 AND salary >= 4000000 AND salary <= 5000000;
-> 6번 규칙에 해당하는 예시이다. dno -> salary 순서 혹은 dno로 검색해야 하는데 salary만 조건으로 사용하여 인덱스가 사용되지 않는 경우가 발생한다.