Rookiss Part5 데이터베이스 : 복합인덱스
🙇♀️복합 인덱스
USE Northwind;
- 주문 상세 정보를 살펴보자
SELECT *
FROM [Order Details]
ORDER BY OrderID;
- 임시 테스트 테이블을 만들고 데이터 복사한다
SELECT *
INTO TestOrderDetails
FROM [Order Details];
SELECT *
FROM TestOrderDetails
- 복한 인덱스 추가
CREATE INDEX Index_TestOrderDetails
ON TestOrderDetails(OrderID, ProductID);
- 인덱스 정보 살펴보기
EXEC sp_helpindex 'TestOrderDetails';
- (OrderID, ProductID)? OrderID?, ProductID?
- INDEX SCAN (INDEX FULL SCAN) -> BAD
- INDEX SEEK -> GOOD
🪐인덱스 적용 테스트
- 인덱스 적용 테스트 1 -> GOOD
SELECT *
FROM TestOrderDetails
WHERE OrderID = 10248 AND ProductID = 11;
- 인덱스 적용 테스트 2 -> GOOD
SELECT *
FROM TestOrderDetails
WHERE ProductID = 11 AND OrderID = 10248;
- 인덱스 적용 테스트 3 -> GOOD
SELECT *
FROM TestOrderDetails
WHERE OrderID = 10248;
- 인덱스 적용 테스트 4 -> BAD
SELECT *
FROM TestOrderDetails
WHERE ProductID = 11;
- INDEX 정보
DBCC IND('Northwind','TestOrderDetails', 2);
880
832 840 841 842 843 844
DBCC PAGE('Northwind', 1, 832, 3);
- 따라서 인덱스(A, B) 사용중이라면 인덱스(A) 없어도 무방
-
하지만 B로도 검색이 필요하면 -> 인덱스(B)는 별도로 걸어줘야 함
- 인덱스는 데이터가 추가/갱신/삭제 유지되어야 함
- 데이터 50개를 강제로 넣어보자.
- 10248/11 10387/24
DECLARE @i INT = 0;
WHILE @i < 50
BEGIN
INSERT INTO TestOrderDetails
VALUES (10248, 100 + @i, 10, 1, 0);
SET @i = @i + 1;
END
- INDEX 정보
DBCC IND('Northwind','TestOrderDetails', 2);
881이라는 것이 생김, 832 다음에 881임, 832의 데이터가 너무 많아져서 둘로 쪼갠 것이다.
880
832 [881] 840 841 842 843 844
DBCC PAGE('Northwind', 1, 832, 3);
DBCC PAGE('Northwind', 1, 881, 3);
결론: 페이지 여유 공간이 없다면 -> 페이지 분할(SPLIT) 발생
🪐인덱스 가공 테스트
가공 테스트
SELECT LastName
INTO TestEmployees
FROM Employees;
SELECT * FROM TestEmployees;
- 인덱스 추가
CREATE INDEX Index_TestEmployees
ON TestEmployees(LastName);
- INDEX SCAN -> BAD
SELECT *
FROM TestEmployees
WHERE SUBSTRING(LastName, 1, 2) = 'Bu';
SUBSTRING은 인덱스를 활용하지 못한다
- INDEX SEEK -> GOOD
SELECT *
FROM TestEmployees
WHERE LastName LIKE 'Bu%';
인덱스를 사용하고 싶으면 LIKE를 사용 해야됨
🪐
오늘의 결론
- 복합 인덱스(A, B)를 사용 할 때 순서 주의 (A->B 순서 검색)
- 인덱스 사용 시, 데이터 추가로 인해 페이지 여유 공간이 없으면 SPLIT
- 키 가공할 때 주의!