🙇‍♀️복합 인덱스

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
  • 키 가공할 때 주의!

태그:

카테고리:

업데이트: