이번 강의에서는 기존 BaseballData가 아닌 Northwind Database를 사용한다.
해당 데이터베이스는 Microsoft에서 제공하는 샘플 데이터베이스이며, 다양한 실습에 활용 가능하다.
📌 Northwind Database 다운로드 및 설정
🔗 Northwind GitHub Repository
✅ 현재 데이터베이스 정보 확인
-- 데이터베이스 정보 확인
EXEC sp_helpdb 'Northwind';
🔹 출력 정보
✅ Northwind의 테이블 목록 확인
SELECT * FROM sys.tables;
📌 인덱스의 개념
📌 인덱스의 장점
✅ 검색 속도 향상
✅ 정렬된 데이터 저장으로 빠른 탐색 가능
✅ WHERE 조건문을 빠르게 실행 가능
📌 인덱스의 단점
❌ 인덱스를 많이 만들면 데이터 삽입/삭제 성능 저하
❌ 추가적인 저장 공간 필요
SQL에서 인덱스를 직접 생성하고 조회하는 방법을 실습해보자.
✅ 인덱스를 테스트할 테이블 생성
-- 임시 테이블 생성 (인덱스 테스트용)
CREATE TABLE Test
(
EmployeeID INT NOT NULL,
LastName NVARCHAR(20) NULL,
FirstName NVARCHAR(20) NULL,
HireDate DATETIME NULL
);
GO
✅ Employees 테이블에서 데이터 복사
-- Employees 테이블에서 데이터를 가져와 Test 테이블에 삽입
INSERT INTO Test
SELECT EmployeeID, LastName, FirstName, HireDate
FROM Employees;
✅ 테이블 데이터 확인
SELECT * FROM Test;
-- 인덱스 생성 (LastName 기준)
-- FILLFACTOR = 1 (리프 페이지 공간 1%만 사용)
-- PAD_INDEX = ON (FILLFACTOR 중간 페이지 적용)
CREATE INDEX Test_Index ON Test(LastName)
WITH (FILLFACTOR = 1, PAD_INDEX = ON);
GO
📌 설명:
FILLFACTOR = 1 : 리프(Leaf) 페이지 공간 중 1%만 사용 PAD_INDEX = ON : FILLFACTOR가 중간 페이지에도 적용 FILLFACTOR와 PAD_INDEX는 실무에서 잘 사용하지 않지만, 테스트용으로 활용 ✅ 생성된 인덱스 정보 확인
-- 현재 생성된 인덱스 조회
SELECT index_id, name
FROM sys.indexes
WHERE object_id = object_id('Test');
🔹 출력 예시
| index_id | name |
|----------|-------------|
| 1 | PK_Test |
| 2 | Test_Index |
✅ 인덱스 구조 확인 (DBCC IND 사용)
-- 2번 인덱스의 상세 정보 조회
DBCC IND('Northwind', 'Test', 2);
📌 DBCC IND 분석 요소
📌 트리 구조 예시
[ Root: 969 ]
/ \
[992] [968]
/ \ / \
[952] [960] [961] [970]
각 인덱스 페이지 내 정보를 상세히 분석할 수 있다.
✅ 특정 인덱스 페이지 조회
-- 특정 페이지(952번)의 상세 정보 조회
DBCC PAGE('Northwind', 1, 952, 3);
DBCC PAGE('Northwind', 1, 960, 3);
DBCC PAGE('Northwind', 1, 961, 3);
📌 DBCC PAGE 결과 분석
✅ HEAP RID 예제
Heap RID: (1:952:10) -- 파일ID:1, 페이지ID:952, 슬롯번호:10
Heap RID: (1:960:5) -- 파일ID:1, 페이지ID:960, 슬롯번호:5
✅ 기본 조회 (인덱스 미사용)
SELECT * FROM Test WHERE LastName = 'Callahan';
✅ 인덱스를 활용한 검색 (실제 실행 계획 확인)
SET STATISTICS IO ON; -- I/O 통계 확인
SELECT * FROM Test WHERE LastName = 'Callahan';
SET STATISTICS IO OFF;
📌 실행 계획 분석
1️⃣ 임시 테이블 생성 (Test 테이블)
2️⃣ Employees 테이블에서 데이터 삽입
3️⃣ 인덱스 생성 (Test_Index on LastName)
4️⃣ 인덱스 조회 (sys.indexes, DBCC IND)
5️⃣ 인덱스 페이지 구조 확인 (DBCC PAGE)
6️⃣ 인덱스를 활용한 검색 최적화 (Clustered Index Seek)
✅ "SQL 튜닝의 핵심은 인덱스를 효율적으로 활용하는 것이다!" 🚀