🧪 실습 환경 세팅

USE Northwind;

-- [1] 테스트 테이블 생성
CREATE TABLE TestAccess
(
	id INT NOT NULL,
	name NCHAR(50) NOT NULL,
	dummy NCHAR(1000) NULL  -- 일부러 페이지 수 늘리기 위함
);

-- [2] 클러스터드, 논클러스터드 인덱스 생성
CREATE CLUSTERED INDEX TestAccess_CI ON TestAccess(id);
CREATE NONCLUSTERED INDEX TestAccess_NCI ON TestAccess(name);

-- [3] 테스트 데이터 입력
DECLARE @i INT = 1;
WHILE (@i <= 500)
BEGIN
	INSERT INTO TestAccess VALUES (@i, 'Name' + CONVERT(VARCHAR, @i), 'Hello World' + CONVERT(VARCHAR, @i));
	SET @i += 1;
END

🔎 인덱스 정보 확인

EXEC sp_helpindex 'TestAccess';

SELECT index_id, name
FROM sys.indexes
WHERE object_id = object_id('TestAccess');
  • index_id = 1 → Clustered Index (id)
  • index_id = 2 → Non-Clustered Index (name)

🧠 실행 계획 분석을 위한 설정

SET STATISTICS TIME ON;
SET STATISTICS IO ON;

📌 실행 계획 비교

1. Index Scan (Full Scan)

SELECT * FROM TestAccess;
  • 전체 테이블 순차 스캔
  • Leaf Page 전체를 차례대로 읽는다
  • 논리적 읽기: 169 페이지

📌 페이지 구조:

Clustered Index Root: 8097
Leaf: 944 ~ 8103 (총 167 페이지)

2. Index Seek (정밀 조회)

SELECT * FROM TestAccess WHERE id = 104;
  • 정확한 키 값으로 조회
  • 클러스터드 인덱스를 타고 빠르게 탐색
  • 논리적 읽기: 2 페이지

📌 탐색 과정:
1. 루트 페이지 → ID 탐색
2. 해당 ID 위치한 페이지 접근


3. Index Seek + Key Lookup (논클러스터드 + 클러스터드 혼합)

SELECT * FROM TestAccess WHERE name = 'Name5';
  • 논클러스터드 인덱스를 타고 탐색한 후
  • 다시 클러스터드 인덱스를 통해 실제 데이터 찾음
  • 논리적 읽기: 4 페이지

📌 탐색 과정:
1. 논클러스터드 인덱스에서 name5 탐색
2. 해당 행의 ID 값을 얻음
3. 클러스터드 인덱스에서 ID를 다시 탐색

이때 클러스터드 인덱스 접근을 Key Lookup이라고 부른다.


4. Index Scan + Key Lookup (TOP + ORDER BY 조합)

SELECT TOP 5 * FROM TestAccess ORDER BY name;
  • Index Scan이지만 논리적 읽기 13로 효율적!
  • 이유:
    • name은 논클러스터드 인덱스 → 이미 정렬되어 있음
    • 정렬된 상태에서 TOP 5만 가져오면 되므로 효율적

profile
李家네_공부방

0개의 댓글