데이터베이스의 검색 속도 향상을 위해서 사용하는 인덱스를 한 번에 여러 컬럼에 거는 것이 복합인덱스이다.
유명한 Northwind Database를 사용해서 복합인덱스의 개념을 알아보자.
USE Northwind;
-- Order Details를 복사한 테스트 테이블 생성
SELECT *
INTO TestOrderDetails
FROM [Order Details];
-- OrderID, ProductID 복합인덱스 생성
CREATE INDEX Index_TestOrderDetails
ON TestOrderDetails(OrderID, ProductID);
테스트용 복합인덱스를 만들어준다. OrderID와 ProductID를 인덱스로 지정해주었다.
-- 1
SELECT *
FROM TestOrderDetails
WHERE OrderID = 10248 AND ProductID = 11;
-- 2
SELECT *
FROM TestOrderDetails
WHERE OrderID = 10248;
-- 3
SELECT *
FROM TestOrderDetails
WHERE ProductID = 11;
순서대로 드래그한 뒤 CTRL + L을 누르면,
이렇게 실행 계획을 확인할 수 있게 된다. 우리가 확인할 부분은 바로 Index Seek다. Index Seek는 NonClustered Index 트리를 타고 원하는 인덱스로 바로 찾아가는 방식을 말한다. 뒤에 나올 Index Scan과 비교했을 때 일반적인 경우에서 훨씬 경제적으로 인덱스를 찾아준다. 1번 경우는 효과적으로 인덱스를 찾았다.
2번 역시 Index Seek, 경제적인 방식으로 인덱스를 찾아준다.
3번은 다르다. 테이블 스캔이라는 말로 Index Scan 방식으로 인덱스를 찾는다. Index Scan은 찾고자 하는 테이블의 모든 칼럼을 찾게 된다. 일반적으로 인덱스를 찾는 데에 시간이 더 소요된다.
2번과 3번은 같은 복합인덱스에서 인덱스를 찾는 행위인데 왜 2번에 비해 3번이 더 오랜 시간이 걸리게 될까?
만약 우리가 복합인덱스를 (A, B) 순서로 잡았다면 복합인덱스는 A를 먼저 정렬하고 그에 맞춰서 B를 정렬한다. 인덱스를 검색 할 때 A, B순서나 A만 검색한다면 당연히 복합인덱스의 혜택을 받아 빠른 인덱스 검색이 가능하다. 하지만 우리가 B를 검색하려고 하면 인덱스는 복합인덱스를 무시하고 (복합인덱스는 A를 통한 B의 인덱스를 걸었기 때문에 B만 사용할 수 없음) 모든 테이블을 전부 다 스캔하는 Index Scan을 하게 된다. 복합인덱스를 (A, B) 순서로 잡고 B도 인덱스의 혜택을 받게 하고 싶다면 B는 또 따로 인덱스를 걸어야 한다.
✔복합인덱스에서는 인덱스를 거는 순서가 매우 중요하다. 인덱스 순서에 따라 A는 따로 인덱스를 걸지 않아도 인덱스 효과를 볼 수 있고 B는 따로 인덱스를 걸어야만 인덱스 효과를 누릴 수 있다.
'공부 > 데이터베이스' 카테고리의 다른 글
[데이터베이스] 정렬(Sort/Sorting) 줄이기 (0) | 2022.07.08 |
---|---|
[데이터베이스] JOIN(조인) : Nested Loop, Merge, Hash (0) | 2022.07.08 |
[데이터베이스] Transaction(트랜잭션)이란? (0) | 2022.07.07 |
[데이터베이스] Clustered Index와 Non-Clustered Index (0) | 2022.07.02 |
[데이터베이스] Microsoft SQL 쓰는 순서와 실행 순서 (0) | 2022.06.27 |