반응형
오늘은 Query 실행 시 테이블, 인덱스(index)를 어떻게 scan 하는지 설명하려고 합니다.
인덱스(INDEX) 스캔 종류
- 테이블 풀 스캔 (table full scan).
- 인덱스 풀 스캔 (index full scan).
- 인덱스 고유 스캔 (index unique scan).
- 인덱스 범위 스캔 (index range scan).
- 인덱스 루스 스캔 (index loose scan).
- 인덱스 병합 스캔 (index merge scan).
인덱스(INDEX) 스캔 특징 및 설명.
테이블 풀 스캔 (table full scan)
- 인덱스 유무를 무시하고 테이블 데이터에 바로 가서 처음부터 끝까지 데이터를 스캔하는 방식입니다.
- 테이블에 인덱스가 없거나, WHERE 조건이 없는 경우 발생합니다.
- 테이블에 대량의 데이터가 있는 경우 성능저하의 원인이 됩니다.
인덱스 풀 스캔 (index full scan)
- Index에 처음부터 끝까지 탐색하는 스캔 방식입니다.
- Where 절에서 인덱스 칼럼 중 하나 이상을 사용하였을 때 또는 SQL에서 사용한 칼럼들이 모두 하나의 인덱스에 존재할 때 사용됩니다.
- 주로 데이터 검색을 위한 최적의 인덱스가 없을 때 차선으로 적용됩니다.
인덱스 고유 스캔 (index unique scan)
- Primark Key를 생성 또는 Unique Index가 존재하는 경우 가능합니다.
- Index Unique Scan은 index를 사용해서 검색할 때 가장 빠르게 데이터를 반환할 수 있습니다.
- 조건절에는 key에 대한 조건이 있어야 하며, join 절이 있는 경우는 key에 해당하는 칼럼에 조건을 넣어줘야 합니다.
인덱스 범위 스캔 (index range scan)
- index가 생성된 칼럼에 대해 범위 검색을 하는 방식입니다.
- 보통 비교연산자를 사용한 대다수의 경우가 이 방식으로 처리됩니다.
- 예를 들면 조건절에 <, <=, >, >=, between, like 있을 때 적용됩니다.
- Index Range Scan에서 속도를 빠르게 하기 위해서는 Index를 스캔하는 범위를 얼마만큼 줄일 수 있느냐가 속도에 중요합니다.
- 즉, 액세스 하는 횟수를 얼마만큼 줄일 수 있느냐가 속도에 관건이죠.
인덱스 루스 스캔 (index loose scan)
- 인덱스의 필요한 부분들만 골라 스캔하는 방식
- WHERE 절 기준으로 필요한 데이터만 스캔하고, 불필요한 데이터의 인덱스 키는 무시합니다.
- 그리고 GROUP BY 함수, MAX(), MIN() 함수 등이 사용되는 경우 index loose scan 작동합니다.
인덱스 병합 스캔 (index merge scan)
- 테이블 내에 생성된 인덱스들을 통합해서 스캔하는 방식으로 'OR' 조건을 사용할 때 적용됩니다.
- 인덱스를 각각 수행하므로 성능저하의 원인입니다.
SELECT aurum_id, aurum_age
FROM dbo.aurum_indexScan
WHERE aurum_id = '1000' or aurum_age >= 10
;
반응형