인덱스가 생성되어 있는데도 인덱스를 타지 않는 경우가 있다.
그 이유를 정리해보자!
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';
참고
'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 |