Database

PostgreSQL 인덱스를 타지 않는 이유

hjkang

인덱스가 생성되어 있는데도 인덱스를 타지 않는 경우가 있다.

그 이유를 정리해보자!

 

 

1. 인덱스에 변형을 준 경우

select * from table
where LOWER(name) = 'world';

select * from table
where seq - 1 = 5;



2. NOT 또는 IN 연산자 사용

- NOT일 경우에도 인덱스를 타긴 타지만, 일반적으로, NOT에 사용된 값이 아닌 데이터의 비율이 높은 경우가 많기 때문에 인덱스를 타지 않는 경우가 많다.
- 마찬가지로 IN일 경우에도, IN에 포함된 데이터들의 비율이 매우 높다면 풀스캔을 하는 것이 낫다고 DBMS가 판단하면 인덱스를 타지 않는다.

 


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

- 문자열로 이루어진 값을 인덱스로 잡았을 때, %가 앞쪽에 사용되면 정렬 순서를 사용할 수 없으므로 테이블 풀스캔이 이루어진다.

select * from table
where name like '%world';

- 이런 경우에는 인덱스를 탄다. 문자열 정렬 순서를 그대로 이용할 수 있기 때문이다.

select * from table
where name like 'world%';



4. 복합 컬럼 index에서 OR 조건을 사용한 경우

- name과 seq 둘 다 인덱스가 걸려있어도 DBMS가 최적의 OR 조건을 뽑기 힘들어, 풀스캔하는 경우가 많다.

select * from table
where name = 'world' or seq = 5

 


5. Optimizer의 선택

- 인덱스가 name과 id로 2개가 있을 경우 id나 name 인덱스 중 하나가 선택될수도 있고, 둘 다 선택 될 수도 있다.

select * from table
where name ='world' and id ='hello';

 

 


참고

- http://elky.tistory.com/210

'Database' 카테고리의 다른 글

PostgreSQL 배열 함수  (0) 2023.05.16
PostgreSQL UNION, UNION ALL  (0) 2023.05.15
PostgreSQL 문자열 함수  (0) 2023.05.11
PostgreSQL 함수(Function)  (0) 2023.05.10
PostgreSQL GIN Index  (0) 2023.01.30