bdfgdfg

[MSSQL] 복합 인덱스 본문

CS/DB

[MSSQL] 복합 인덱스

marmelo12 2022. 10. 17. 23:07
반응형

가장 중요한 개념이 있다.

 

인덱스는 여러개의 칼럼에 설정할 수 있다.

단일 인덱스를 여러개 생성할 수 있고, 여러 칼럼을 묶은 복합 인덱스를 설정할 수도 있다.

다만 인덱스는 디비의 메모리를 사용하여 테이블 형태로 저장하므로 개수와 저장되는 공간은 비례하기에

where절에 자주 사용되며 고유한 값 위주로 인덱스를 설정하는게 옳다.

 

select *
INTO TestTable2
FROM [Order Details] -- NorthWind db의 테이블

-- 복합 인덱스 추가
CREATE INDEX INDEX_TESTINDEX ON TestTable2(OrderID,ProductID); -- 두 칼럼을 대상으로 인덱스를 걸음.

결론만 말하면 두 칼럼을 대상으로 인덱스가 걸려있을 때 where절을 통해 각 칼럼(OrderID는 A ProductID는 B라고 지칭)

A,B를 조건으로 SELECT 시 인덱스의 덕을본다. A 칼럼만을 조건으로 넣어도 동일하다.

단! B만을 가지고 WHERE절 조건을 넣어 검색을하면 풀스캔하는 방식과 다른게 없다. (즉 인덱스 덕을 보지못한다)

 -> 복합 인덱스를 볼 때 가장 중요한 것. 즉 복합 인덱스의 칼럼을 어떤 순서로 걸었는지가 매우 중요.

 -> 그 이유는 간단히 말하면 실제 인덱스(A,B)를 걸 때 A를 기준으로 데이터를 정렬하고 A가 동일한 경우에만 B를 이용해 둘 사이의 우선순위를 결정하게 됨. 

 

실제로 WHERE절 조건을 각 3가지로 나누어서 성능을 확인해보면 (Ctrl + L)

 

1. Where절 조건에 OrderID,ProductID 모두. (참고로 둘 다 조건으로 둘어오는 경우 WHERE절 조건에 순서가 ProductID가 먼저와도 상관X)

-- INDEX SEEK가 빠르다고 보면됨. SCAN은 느린 것.
SELECT *
	FROM TestTable2
	WHERE OrderID = 10252 AND ProductID = 455

2. Where절 조건에 OrderID만

-- INDEX SEEK가 빠르다고 보면됨. SCAN은 느린 것.
SELECT *
	FROM TestTable2
	WHERE OrderID = 10252

3. Where절 조건에 ProductID만

-- INDEX SEEK가 빠르다고 보면됨. SCAN은 느린 것.
SELECT *
	FROM TestTable2
	WHERE ProductID = 455

 

만약 ProductID만을 대상으로 검색이 자주 일어나야한다면 해당 칼럼을 대상으로 따로 인덱스를 걸어줘야한다.

 -> 다만 위에서 A,B칼럼이 복합인덱스인데 A칼럼을 하나 더 인덱스걸어준다던지 하는짓은 하면 안된다. (공간낭비)

 

참고로 위의 내용은 인덱스가 Clustered/Non-Clustered 상관없이 모두 해당 되는 내용.

 -> Non-Clustered의 경우 정렬방식은 아니고 따로 테이블이 만들어지는 형식.

 

마지막으로, 인덱스를 걸었다해서 (앞에서 a,b순서에서 a를 걸었다하더라도) where절 조건에서 온전한 값으로 조건을 걸어 조회하는게 아니면 INDEX Seek이 아닌 Index Scan을 볼 수 있다.

 

대표적인 예로 문자열 칼럼을 대상으로 인덱스를 걸을 때.

WHERE SUBSTRING(NickName,1,4) = 'abcd';

위와 같이 인덱스의 값을 가공해서 조건을 달 경우 인덱스 Seek이 되지 않을 수 있음.

반응형

'CS > DB' 카테고리의 다른 글

[MSSQL] 트랜잭션(Transaction)  (0) 2022.10.06
[MSSQL] 인덱스(Index)  (0) 2022.09.29
Comments