Index Range Scan 개요

Index Range Scan은 인덱스를 사용하여 특정 범위 내의 데이터를 검색하는 방식입니다.
BETWEEN, <, >, LIKE 'A%', IN 등의 연산자를 사용할 때 발생하며, 여러 개의 결과를 반환할 가능성이 있습니다.

1️⃣ 특징

✔ 범위 검색(연속된 값 검색) 시 사용
✔ 여러 개의 행을 반환할 가능성이 높음
✔ B-Tree 인덱스에서 루트 → 리프 노드까지 탐색 후, 조건에 맞는 데이터까지 순차적으로 읽음
✔ 순차적인 인덱스 검색이므로 성능이 우수함

2️⃣ 사용 조건

  • 범위 연산자 (BETWEEN, <, >, LIKE 'A%', IN)를 사용한 검색
  • 인덱스의 일부 키만 사용하는 경우
  • 결과가 다수의 행을 반환할 가능성이 있는 경우

3️⃣ 쿼리 예제

(1) 기본적인 Index Range Scan 예제

✅ 범위 검색 (BETWEEN, <, >)

SELECT * FROM EMP WHERE EMP_ID BETWEEN 1000 AND 2000;

🔍 실행 계획 (EXPLAIN PLAN)

INDEX RANGE SCAN (EMP_IDX)

✔ EMP_ID가 인덱스 컬럼이라면 범위 내 값을 검색할 때 Index Range Scan 발생

✅ 보다 작은 값 검색 (<)

SELECT * FROM EMP WHERE EMP_ID < 1000;

✔ 1000 이하의 값을 찾기 위해 인덱스에서 처음부터 검색

✅ 보다 큰 값 검색 (>)

SELECT * FROM EMP WHERE EMP_ID > 1000;

✔ 1000 이후의 값을 찾기 위해 인덱스의 특정 지점에서 끝까지 검색

(2) LIKE 검색에서 Index Range Scan

✅ LIKE 연산자가 접두어 검색(LIKE 'A%')일 경우

SELECT * FROM EMP WHERE EMP_NAME LIKE 'A%';

🔍 실행 계획:

INDEX RANGE SCAN (EMP_NAME_IDX)

✔ ‘A%’는 인덱스 정렬 순서를 유지하면서 검색할 수 있어 Index Range Scan 사용 가능

❌ 와일드카드가 앞에 있는 경우 (LIKE '%A')는 Index Range Scan 사용 불가

SELECT * FROM EMP WHERE EMP_NAME LIKE '%A';

🔍 실행 계획:

FULL TABLE SCAN

✔ 인덱스를 사용할 수 없어 Full Table Scan 발생

(3) IN 연산자에서 Index Range Scan 발생

✅ IN 연산자 사용

SELECT * FROM EMP WHERE EMP_ID IN (1001, 1002, 1003);

🔍 실행 계획:

INDEX RANGE SCAN (EMP_IDX)

✔ 각각의 EMP_ID 값을 찾아야 하므로 범위 검색처럼 처리됨

(4) Index Range Scan을 강제하는 힌트(Query Hint)

✅ INDEX 힌트 사용

SELECT /*+ INDEX(EMP EMP_IDX) */ * 
FROM EMP
WHERE EMP_ID BETWEEN 1000 AND 2000;

🔍 실행 계획:

INDEX RANGE SCAN (EMP_IDX)

✔ 옵티마이저가 다른 실행 계획을 선택하지 않도록 강제 적용

4️⃣ Index Range Scan이 발생하지 않는 경우

❌ 정확한 값(Unique Value)을 조회하는 경우

SELECT * FROM EMP WHERE EMP_ID = 1001;

🔍 실행 계획:

INDEX UNIQUE SCAN (EMP_PK)

✔ 단일 값 검색은 Index Unique Scan이 발생

❌ LIKE 연산자에서 %가 앞에 있는 경우

SELECT * FROM EMP WHERE EMP_NAME LIKE '%A';

🔍 실행 계획:

FULL TABLE SCAN

✔ 전체 문자열을 검사해야 하므로 Index Range Scan이 아닌 Full Table Scan 발생

5️⃣ Index Range Scan vs. 다른 Index Scan과 비교

스캔 유형설명사용 조건
Index Unique ScanPK, UNIQUE 인덱스에서 단일 값 검색WHERE 컬럼 = 값
Index Range Scan범위 검색 (BETWEEN, <, >)WHERE 컬럼 > 값 또는 LIKE 'A%'
Index Full Scan인덱스 전체 검색정렬이 필요하거나 인덱스 자체만 읽을 때
Index Fast Full Scan멀티 블록 읽기 사용인덱스 전체를 빠르게 읽을 때
Index Skip Scan복합 인덱스의 일부 키만 사용선행 컬럼 없이 후행 컬럼을 검색할 때

6️⃣ 최적화 전략

🔹 범위 검색(BETWEEN, <, >, LIKE 'A%')을 효과적으로 사용하면 Index Range Scan을 유도할 수 있음
🔹 불필요한 Full Table Scan을 피하고, 인덱스 검색이 효율적으로 이루어지는지 실행 계획을 확인
🔹 INDEX(TABLE_NAME INDEX_NAME) 힌트를 사용하여 옵티마이저가 Index Range Scan을 사용하도록 유도할 수 있음

📌 정리

✅ Index Range Scan은 범위 검색 (BETWEEN, <, >, LIKE 'A%', IN)을 수행할 때 발생하며, 여러 개의 행을 반환할 가능성이 있음
✅ 정확한 값 검색은 Index Unique Scan이 발생하지만, 범위 검색이 포함되면 Index Range Scan이 발생함.
✅ 옵티마이저가 다른 실행 계획을 선택하지 않도록 INDEX 힌트를 사용하여 강제 적용 가능 🚀

zerg96

Recent Posts

정보보안기사 필기 핵심 개념, 접근통제·인증 8문제로 정리

필기 시험의 접근통제 영역은 용어 하나만 알아도 풀리는 문제와 개념을 뒤집어 묻는 문제가 섞여 나옵니다.…

3시간 ago

유튜브 AI 영상 범람, 진짜 크리에이터는 어떻게 살아남나

유튜브에 AI 자동 생성 영상이 넘쳐납니다. 진짜 크리에이터들은 어떻게 살아남아야 할까요? AI와 경쟁하는 3가지 생존…

4시간 ago

코스피 사이드카 이틀 만에 또 발동, 올해만 27번째…5분간 멈추는 건 ‘프로그램 매도’뿐입니다

이틀 전에 사이드카가 걸렸을 때만 해도 "한 번 놀란 장"으로 끝날 줄 알았는데요. 15일 아침…

4시간 ago

코스피 낙폭 7%로 확대, 외국인 1.7조 순매도: 10월 15일 오전 10시 시황

오전 시황 글에 이어 장중 후속 정리입니다. 코스피는 개장 직후 5%대였던 낙폭이 오전 10시 전후에…

8시간 ago

코스피 5.59% 급락 출발, 개장 7분 만에 매도 사이드카: 10월 15일 오전 시황

10월 15일 목요일 아침, 코스피가 전날 종가보다 5.59% 낮은 5,673.01로 출발했습니다. 장 시작 7분 만에…

8시간 ago

삼성 갤럭시 AI, 솔직히 기대 이하였다 — 실망스러운 이유 TOP 5

삼성 갤럭시 AI, 써보니 실망스러웠다. 온디바이스 한계, 지역 제한, 낮은 일상 활용도 등 현실적인 문제점…

9시간 ago