🔹 1. 테이블 스캔(Table Scan)
테이블을 검색하는 방식으로 크게 두 가지가 있습니다.
1-1. 풀 테이블 스캔(Full Table Scan, FTS)
테이블의 모든 데이터를 처음부터 끝까지 읽어가면서 검색하는 방식입니다.
✅ 특징
• 인덱스를 사용하지 않음
• 랜덤 I/O가 아닌 Sequential I/O 로 동작 (속도 최적화 가능)
• 대량의 데이터를 읽을 때 유리하지만, 소량 데이터 검색에는 비효율적
✅ 발생하는 경우
• WHERE 조건절에 인덱스를 활용할 수 없는 경우
• 테이블 전체를 스캔하는 것이 더 효율적일 때 (예: 많은 데이터를 반환하는 경우)
✅ 예제
select * from emp
• employees 테이블을 처음부터 끝까지 읽음 → Full Table Scan 발생
1-2. 테이블 액세스 BY ROWID(Table Access by ROWID)
인덱스를 통해 특정 데이터의 ROWID를 찾은 후, 해당 ROWID를 이용해 테이블에서 데이터를 조회하는 방식입니다.
✅ 특징
• 인덱스를 통해 데이터 위치를 찾아 직접 접근
• 랜덤 I/O(Random I/O) 발생 → 속도가 느릴 수도 있음
• 인덱스 스캔 후 발생하는 경우가 많음 (Index Range Scan + Table Access by ROWID 조합이 일반적)
✅ 예제
select * from emp where emp_id = 100
• employee_id가 PK(프라이머리 키) 인덱스로 설정되어 있으면 인덱스를 이용해 ROWID를 찾고, 해당 ROWID를 이용해 테이블에서 데이터를 읽음
• “Index Unique Scan + Table Access by ROWID” 조합 발생
🔹 2. 인덱스 스캔(Index Scan)
테이블이 아니라 인덱스를 활용하여 데이터를 조회하는 방식입니다.
데이터 양이 적을수록, 그리고 조건이 인덱스를 잘 활용할수록 성능이 좋아집니다.
2-1. 인덱스 유니크 스캔(Index Unique Scan)
PK(Primary Key) 또는 Unique 인덱스가 걸려 있는 컬럼을 정확히 조회할 때 사용됩니다.
(결과가 최대 한 개의 행만 나올 경우)
✅ 특징
• 랜덤 I/O(Random I/O) 발생
• 가장 빠른 인덱스 검색 방식
• PK 또는 Unique 인덱스를 활용하는 WHERE 절에서 주로 사용됨
✅ 예제
select * from emp where emp_id = 101
• employee_id는 Primary Key → Index Unique Scan 발생
• 반드시 하나의 결과만 반환됨
2-2. 인덱스 범위 스캔(Index Range Scan)
WHERE 조건절이 범위 검색(BETWEEN, <, >, LIKE 등) 을 포함할 때 사용됩니다.
(결과가 여러 개의 행이 나올 가능성이 있음)
✅ 특징
• 랜덤 I/O(Random I/O) 발생
• 인덱스를 사용하지만, 단일 값이 아니라 범위를 조회하므로 여러 블록을 탐색
• 주로 B-Tree 인덱스를 활용
✅ 발생하는 경우
• BETWEEN, <, >, LIKE 'abc%' 같은 범위 조건이 있는 경우
• 결과가 여러 개 나올 수 있을 때
✅ 예제
select * from emp where emp_id between 100 and 200
• employee_id가 인덱스로 존재하는 경우, Index Range Scan 수행
2-3. 인덱스 풀 스캔(Index Full Scan)
인덱스 전체를 처음부터 끝까지 읽는 방식입니다.
(테이블을 읽는 것이 아니라, 인덱스를 통해 데이터를 읽음)
✅ 특징
• 테이블 전체를 스캔하는 것보다 빠를 수 있음
• ORDER BY 절과 결합되면 성능 최적화 가능
• WHERE 조건이 없어도 발생 가능 (예: 인덱스 컬럼만 조회하는 경우)
✅ 예제
select * from emp order by emp_id
• employee_id 컬럼이 인덱스로 존재하면 Index Full Scan 수행
2-4. 인덱스 패스트 풀 스캔(Index Fast Full Scan)
인덱스 전체를 읽지만, 인덱스를 랜덤하게 읽지 않고 병렬로 읽을 수 있는 방식입니다.
✅ 특징
• Random I/O가 아니라 Multiblock I/O를 활용 → 빠름
• 테이블을 조회하지 않고, 인덱스 컬럼만 이용하는 경우에 유용
• “Full Table Scan” 대신 사용할 수 있음
✅ 예제
select emp_id from emp
• employee_id가 인덱스로 설정되어 있다면, Index Fast Full Scan 발생 가능
2-5. 인덱스 스킵 스캔(Index Skip Scan)
일반적으로 다중 컬럼 인덱스(Composite Index) 를 사용할 때,
첫 번째 컬럼이 WHERE 절에 포함되지 않아도 인덱스를 활용하는 방식입니다.
✅ 특징
• 다중 컬럼 인덱스에서 첫 번째 컬럼을 건너뛰고(스킵) 검색 가능
• 인덱스가 존재하지만 일반적인 방식으로는 사용되지 않을 때 발생
✅ 예제
select * from emp where dept_id = 50
• (job_id, department_id) 인덱스가 있을 때,
• job_id 조건 없이 department_id로 조회하면 Index Skip Scan 발생 가능
'DataBase' 카테고리의 다른 글
[SQL] B-Tree 인덱스의 탐색 방법 (0) | 2025.03.11 |
---|---|
[SQL] 인덱스 기본 사용법 (0) | 2025.03.10 |
[SQL] 논리적 I/O와 물리적 I/O의 유형 정리 (0) | 2025.03.08 |
[SQL] 데이터베이스 저장 구조(Database Storage Structure) (1) | 2025.03.07 |
[SQL] 오라클 SGA(System Global Area) (2) | 2025.03.07 |