🔥 1. Northwind 데이터베이스 사용

이번 강의에서는 기존 BaseballData가 아닌 Northwind Database를 사용한다.
해당 데이터베이스는 Microsoft에서 제공하는 샘플 데이터베이스이며, 다양한 실습에 활용 가능하다.

📌 Northwind Database 다운로드 및 설정
🔗 Northwind GitHub Repository

현재 데이터베이스 정보 확인

-- 데이터베이스 정보 확인
EXEC sp_helpdb 'Northwind';

🔹 출력 정보

  • 데이터베이스 크기
  • 소유자
  • 파일 경로 등

Northwind의 테이블 목록 확인

SELECT * FROM sys.tables;

🔥 2. 인덱스(Index)란?

📌 인덱스의 개념

  • 책의 색인(Index)과 동일한 개념
  • 데이터베이스 내에서 특정 값을 빠르게 찾을 수 있도록 최적화된 검색 구조
  • B-Tree(균형 이진 트리) 구조로 저장되어 검색 속도 향상
  • 클러스터형(Clustered) & 비클러스터형(Non-Clustered)으로 구분

📌 인덱스의 장점
검색 속도 향상
정렬된 데이터 저장으로 빠른 탐색 가능
WHERE 조건문을 빠르게 실행 가능

📌 인덱스의 단점
인덱스를 많이 만들면 데이터 삽입/삭제 성능 저하
추가적인 저장 공간 필요


🔥 3. 인덱스 실습 (Employees 테이블 활용)

SQL에서 인덱스를 직접 생성하고 조회하는 방법을 실습해보자.

📌 3.1 임시 테이블(Test) 생성 및 데이터 삽입

인덱스를 테스트할 테이블 생성

-- 임시 테이블 생성 (인덱스 테스트용)
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;

🔥 4. 인덱스 생성 및 조회

📌 4.1 인덱스 생성

-- 인덱스 생성 (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가 중간 페이지에도 적용
  • 일반적으로 FILLFACTORPAD_INDEX는 실무에서 잘 사용하지 않지만, 테스트용으로 활용

📌 4.2 인덱스 조회

생성된 인덱스 정보 확인

-- 현재 생성된 인덱스 조회
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(2) → Branch(1) → Leaf(0) : 트리 구조
  • NextPagePID / PrevPagePID : 이전/다음 노드 정보

📌 트리 구조 예시

          [ Root: 969 ]
       /           \
  [992]           [968]
  /    \           /    \
[952]  [960]     [961]  [970]

🔥 5. 인덱스 페이지 분석 (DBCC PAGE)

각 인덱스 페이지 내 정보를 상세히 분석할 수 있다.

특정 인덱스 페이지 조회

-- 특정 페이지(952번)의 상세 정보 조회
DBCC PAGE('Northwind', 1, 952, 3);
DBCC PAGE('Northwind', 1, 960, 3);
DBCC PAGE('Northwind', 1, 961, 3);

📌 DBCC PAGE 결과 분석

  • Heap RID : 데이터 위치(페이지 주소, 파일 ID, 슬롯번호) 정보를 제공
  • RID = [페이지 주소(4)] + [파일 ID(2)] + [슬롯번호(2)]
  • RID를 통해 빠른 데이터 조회 가능

HEAP RID 예제

Heap RID: (1:952:10)  -- 파일ID:1, 페이지ID:952, 슬롯번호:10
Heap RID: (1:960:5)   -- 파일ID:1, 페이지ID:960, 슬롯번호:5

🔥 6. 인덱스를 활용한 데이터 검색

기본 조회 (인덱스 미사용)

SELECT * FROM Test WHERE LastName = 'Callahan';

인덱스를 활용한 검색 (실제 실행 계획 확인)

SET STATISTICS IO ON;  -- I/O 통계 확인
SELECT * FROM Test WHERE LastName = 'Callahan';
SET STATISTICS IO OFF;

📌 실행 계획 분석

  • Table Scan (테이블 전체 검색)(비효율적)
  • Clustered Index Seek (인덱스 기반 검색)(효율적)

📌 실습 과정

1️⃣ 임시 테이블 생성 (Test 테이블)
2️⃣ Employees 테이블에서 데이터 삽입
3️⃣ 인덱스 생성 (Test_Index on LastName)
4️⃣ 인덱스 조회 (sys.indexes, DBCC IND)
5️⃣ 인덱스 페이지 구조 확인 (DBCC PAGE)
6️⃣ 인덱스를 활용한 검색 최적화 (Clustered Index Seek)

"SQL 튜닝의 핵심은 인덱스를 효율적으로 활용하는 것이다!" 🚀

profile
李家네_공부방

0개의 댓글