본문 바로가기
DataBase/MsSql

MSSQL 인덱스(INDEX) 스캔 원리 및 방법

by 아우럼 2024. 7. 11.
반응형

오늘은 Query 실행 시 테이블, 인덱스(index)를 어떻게 scan 하는지 설명하려고 합니다.

 

인덱스(INDEX) 스캔 종류

  1. 테이블 풀 스캔 (table full scan).
  2. 인덱스 풀 스캔 (index full scan).
  3. 인덱스 고유 스캔 (index unique scan).
  4. 인덱스 범위 스캔 (index range scan).
  5. 인덱스 루스 스캔 (index loose scan).
  6. 인덱스 병합 스캔 (index merge scan).

인덱스(INDEX) 스캔 특징 및 설명.

테이블 풀 스캔 (table full scan)

  • 인덱스 유무를 무시하고 테이블 데이터에 바로 가서 처음부터 끝까지 데이터를 스캔하는 방식입니다.
  • 테이블에 인덱스가 없거나, WHERE 조건이 없는 경우 발생합니다.
  • 테이블에 대량의 데이터가 있는 경우 성능저하의 원인이 됩니다.

table full scan
table full scan


인덱스 풀 스캔 (index full scan)

  • Index에 처음부터 끝까지 탐색하는 스캔 방식입니다.
  • Where 절에서 인덱스 칼럼 중 하나 이상을 사용하였을 때 또는 SQL에서 사용한 칼럼들이 모두 하나의 인덱스에 존재할 때 사용됩니다.
  • 주로 데이터 검색을 위한 최적의 인덱스가 없을 때 차선으로 적용됩니다.

index full scan
ndex full scan

인덱스 고유 스캔 (index unique scan)

  • Primark Key를 생성 또는 Unique Index가 존재하는 경우 가능합니다.
  • Index Unique Scan은 index를 사용해서 검색할 때 가장 빠르게 데이터를 반환할 수 있습니다.
  • 조건절에는 key에 대한 조건이 있어야 하며, join 절이 있는 경우는 key에 해당하는 칼럼에 조건을 넣어줘야 합니다.

index unique scan
index unique scan


인덱스 범위 스캔 (index range scan)

  • index가 생성된 칼럼에 대해 범위 검색을 하는 방식입니다.
  • 보통 비교연산자를 사용한 대다수의 경우가 이 방식으로 처리됩니다.
  • 예를 들면 조건절에 <, <=, >, >=, between, like 있을 때 적용됩니다.
  • Index Range Scan에서 속도를 빠르게 하기 위해서는 Index를 스캔하는 범위를 얼마만큼 줄일 수 있느냐가 속도에 중요합니다.
  • 즉, 액세스 하는 횟수를 얼마만큼 줄일 수 있느냐가 속도에 관건이죠.

index range scan
index range scan


인덱스 루스 스캔 (index loose scan)

  • 인덱스의 필요한 부분들만 골라 스캔하는 방식
  • WHERE 절 기준으로 필요한 데이터만 스캔하고, 불필요한 데이터의 인덱스 키는 무시합니다.
  • 그리고 GROUP BY 함수, MAX(), MIN() 함수 등이 사용되는 경우 index loose scan 작동합니다.

index loose scan
index loose scan


인덱스 병합 스캔 (index merge scan)

  • 테이블 내에 생성된 인덱스들을 통합해서 스캔하는 방식으로 'OR' 조건을 사용할 때 적용됩니다.
  • 인덱스를 각각 수행하므로 성능저하의 원인입니다.
SELECT aurum_id, aurum_age 
FROM dbo.aurum_indexScan
WHERE aurum_id = '1000' or aurum_age >= 10
;

 

index merge scan
index merge scan

 

반응형