개발자꿈나무

Index를 타지 않는 쿼리 본문

SQL

Index를 타지 않는 쿼리

망재이 2024. 2. 9. 15:59

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만 조건으로 사용하여 인덱스가 사용되지 않는 경우가 발생한다.

728x90

'SQL' 카테고리의 다른 글

옵티마이저  (0) 2023.02.26
시스템 권한 부여 방법  (0) 2023.02.14
제약 조건  (0) 2023.02.14
동의어  (0) 2023.02.14
시퀀스  (0) 2023.02.14