Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 |
Tags
- 개발자
- 인덱스
- 일감관리
- PM
- 엘라스틱서치
- 비전공개발자
- spring aop
- 이슈관리
- 레드마인
- 검색
- redmine
- spring
- Database
- 웹프론트
- 데이터베이스
- 자바
- 오라클
- elasticsearch
- java
- 스프링
- db
- kibana
- 프로젝트관리
- AOP
- 백엔드
- frontend
- backend
- PreparedStatement
- It
- Si
Archives
- Today
- Total
리타의 저장소
인덱스 스캔 효율 본문


인덱스 스캔 효율 정리
(1) 인덱스 매칭도
- = , IN 조건이 아닌 조건 이후는 무조건 체크 조건
- 드라이빙 조건을 만들어 줘야 한다.
- 조회 조건이 = 이 아닌 컬럼은 가급적 인덱스 뒤쪽으로 배치
- 결합 인덱스 우선순위 결정
- 자주(항상) 사용되는가?
- = 조건
- Cardinality (분포도)
- 소트 연산 대체 가능 여부
- 인덱스 row 7 vs 결과 row 3 → 인덱스가 더 많을 경우 비효율 발생
- 일부 컬럼에만 인덱스가 존재할 경우
(2) 비교 연산자 종류와 컬럼 순서에 따른 인덱스 레코드의 군집성 (인덱스 매칭도)
(3) 인덱스 선행 컬럼이 등치 (=) 조건이 아닐 때 발생하는 비효율 (인덱스 매칭도)
- Sequential 액세스 효율은 선택도에 의해 결정 → 얼마나 적은 레코드를 읽는가?
- 인덱스 컬럼이 조건절에 모두 = 조건일 때 가장 효율적
- 리프 블록을 스캔하면서 읽은 레코드는 모두 필터링 없이 테이블 액세스 → 비효율 0
- 인덱스 컬럼 중 일부가 조건절에서 생략되거나 = 조건이 아니어도 그것이 뒤쪽 컬럼이면 비효율이 없다.
(4) BETWEEN 조건을 IN-List로 바꿨을 때 인덱스 스캔 효율
주의사항
- IN-List 개수가 많지 않아야 한다.
- 수직적 탐색이 IN-List 횟수만큼 발생
- 수평적 스캔의 비효율보다 수직적 탐색의 비효율이 더 클 수 있음
- 인덱스 높이(height)가 높을 때 비효율 증가 가능
💡Tip: IN-List 가 많을 경우 Leaf Block의 비효율이 더 효율적일 수 있음
- 체크 조건 앞의 컬럼들이 변별력이 좋아 검색 구간을 줄였다면 BETWEEN 조건이 유리하다.
(5) Index Skip Scan을 이용한 비효율 해소
- 선두 컬럼이 BETWEEN & Distinct 갯수가 적을 때
- 수직적 탐색이 많은 IN-List 보다 Index Skip Scan 이 근소하게 유리
(6) 범위 조건을 남용할 때 발생하는 비효율
(7) 같은 컬럼에 두 개의 범위 검색 조건 사용 시 주의 사항
(8) BETWEEN 과 LIKE 스캔 범위 비교
- BETWEEN을 사용하는 것이 정확한 방식, LIKE는 개발자 편의에 의한 사용 방식
- BETWEEN을 사용했을 때 성능적으로 손해 보는 것은 없음
- Leaf Node에 존재하는 조건 검색 시 시작, 끝점을 찾는 경우는 = 같은 효과
- LIKE → 일반적으로 Leaf Node에 없는 조건 검색
(9) 선분 이력의 인덱스 스캔 효율
- 선분 이력 → 데이터 변경 시작 시점(유효 시작 시점) ~ 변경 발생 시점(유효 종료 시점) 데이터 관리
- 최근 데이터를 주로 읽는다 → 인덱스 - 종료일자 + 시작일자
- 과거 데이터를 주로 읽는다 → 인덱스 - 시작일자 + 종료일자
- 인덱스 수정 불가 → Index_Desc 힌트 활용
- 중간지점 → 어떠한 인덱스든 비효율이 발생하나 ROWNUM ≤ 1 조건 활용 가능
(10) Access Predicate 와 Filter Predicate
(11) Index Fragmentation
인덱스 단편화(Index Fragmentation)는 데이터 삽입, 삭제, 갱신이 많아지면서 인덱스가 비효율적으로 관리되는 현상을 의미한다. 이를 해결하기 위해 Index Rebuild 또는 Index Coalesce 등을 활용할 수 있다.
마무리
인덱스 스캔의 효율을 높이기 위해서는 인덱스 설계부터 신중해야 하며,
실행 계획(Execution Plan) 분석을 통해 불필요한 범위 스캔을 줄이는 것이 중요함.
나는 그동안 LIKE를 참 많이 써왔는데,
오늘 배운바로는, Date 같은걸 like를 써서 확인하게 되면,
불필요한 partition까지 읽게 되는 경우가 생기더라. 주의해야 할것 같다.

'Dev > Database' 카테고리의 다른 글
| ES | Elastic Search란? (0) | 2025.10.12 |
|---|---|
| 인덱스와 조인 #3 (0) | 2025.10.11 |
| 오라클 DBMS 구조 (0) | 2025.10.11 |
| 인덱스와 조인 #2 (0) | 2025.10.11 |
| 인덱스와 조인 #1 (0) | 2025.10.11 |
