복합 인덱스란?
- 여러개의 칼럼에 동시에 인덱스를 거는 것이다.
예제
- github에 돌아다니는 Northwind를 사용하겠습니다.
주문 상세 정보 살펴보기
SELECT *
FROM [Order Details]
ORDER BY OrderID;
임시 테스트 테이블을 만들고 데이터를 복사하자
- 따로 create table을 하지 않아도 select * into로 만들면서 복사할 수 있다.
SELECT *
INTO TestOrderDetails
FROM [Order Details]
복합 인덱스 추가
- 칼럼 OrderId와 ProductID에 인덱스를 걸겠다.
CREATE INDEX Index_TestOrderDetails
ON TestOrderDetails(OrderId, ProductID);
- 인덱스가 잘 추가된 것을 확인
인덱스 적용 테스트
- ctrl + l을 누르면 인덱스 실행 계획을 볼 수 있다. index seek, index scan(full scan)
-- 인덱스 적용 테스트1 OrderID 10248, ProductID 11
SELECT *
FROM TestOrderDetails
WHERE OrderID = 10248 AND ProductID = 11;
-- 인덱스 적용 테스트 2
SELECT *
FROM TestOrderDetails
WHERE OrderID = 10248
-- 인덱스 적용 테스트 3
SELECT *
FROM TestOrderDetails
WHERE ProductID = 11;
-- 인덱스 적용 테스트4
SELECT *
FROM TestOrderDetails
WHERE ProductID = 11 AND OrderID = 10248
- Index scan은 Index full scan이다 전부 탐색하는 거라서 인덱스를 활용하지못하는 것이다.
- 인덱스 적용 테스트 3번을 제외하고 전부 인덱스 seek를 하고 있다 여기서 발견한 점은 복합 인덱스 (A,B )를 설정할 경우 A는 따로 설정할 필요는 없지만 B를 찾기위해서는 인덱스 B를 따로 설정을 해주어야하는 것이다.
- 복합인덱스 (a, b)표현은 처음 복합인덱스를 설정할 때 (OrderId, ProductID)순으로 했다, 그래서 탐색도 순서에 영향을 받는다. 그래서 앞쪽인 OrderId는 홀로 탐색을해도 index seek지만 productId는 홀로 사용하면 인덱스가 활용되지못한다..
Index에 데이터 추가시 페이지 split
- 만약 위의 페이지에 데이터가 계속 추가된다면 split이 되어야한다. 페이지 split..
인덱스에 데이터가 추가될 경우 페이지 상황
-- 데이터를 임의로 50개를 넣어보자
DECLARE @i INT = 0;
WHILE @i < 50
BEGIN
INSERT INTO TestOrderDetails
VALUES (10248, 100 + @i, 10, 1, 0);
SET @i = @i + 1;
END
DBCC IND('Northwind', 'TestOrderDetails', 2)
- 인덱스는 데이터가 추가 . 갱신/ 삭제 되어도 유지되야한다.
- 기본적으로 page안에 index 정보들이 들어있다..
- 페이지 여유 공간이 없다면 페이지 분할(SPLIT)이 발생
인덱스 가공 테스트
-- 가공 테스트
SELECT LastName
INTO TestEmployees
FROM Employees
--인덱스 추가
CREATE INDEX Index_TestEmployees
ON TestEmployees(LastName)
SELECT *
FROM TestEmployees
WHERE SUBSTRING(LastName, 1, 2) = 'Bu'
--index seek
SELECT *
FROM TestEmployees
WHERE LastName LIKE 'Bu%'
- 위에서 LastName에 Index_TestEmployees 인덱스를 설정하였습니다. 그런데 SELECT를 할 때 SUBSTRING 조건을 준다면 인덱스가 가공이 되어서 실행 계획을 살펴볼때 INDEX SCAN으로 떠서 인덱스를 활용하지 못하는 상황입니다. 결론적으로 인덱스는 가공을 하지않고 저럴 경우 LIKE를 사용하면 INDEX SEEK가 가능한 것입니다
- SUBSTRING도 LIKE랑 비슷하게 볼 수 있는데 LIKE는 원본 문자열을 다 볼 수 있는 거지만 SUBSTRING은 부분을 잘라서 보기에 가공했다고 보는 것이 맞습니다.
- 루키스님의 DB 강의를 학습 후 작성하였습니다.
'MS-SQL' 카테고리의 다른 글
indexScan vs IndexSeek (0) | 2022.04.05 |
---|---|
Clustered vs NonClustered (0) | 2022.04.05 |
패턴매칭_수치연산 (0) | 2022.04.05 |
인덱스 분석 (0) | 2022.04.04 |
데이터베이스_특징_트랜젝션_락 (0) | 2022.04.04 |