이번 포스트에서는 DB에서의 정렬이 일어나는 경우를 알아보겠습니다.
1) 정렬이란?
일반적인 정렬로서 동작하는 Quick Sort의 경우, NLogN의 시간복잡도를 갖습니다.
그러나 데이터의 양이 매우 많은 데이터 베이스에서는 위의 시간복잡도도 매우 위험합니다.
또 데이터 베이스에서는 기본적으로 수천, 수만가지의 데이터를 담고 있게 됩니다.
따라서 메모리만으로는 정렬에 한계가 있기에 디스크까지 가져와 정렬에 사용할 수도 있는데,
이런 경우 이동 비용 역시 고스란히 부담하게 됩니다.
따라서 MSSQL에서 정렬이 일어나는 경우와, 이를 대비하는 방법을 알아보겠습니다.
2) 정렬을 수행하는 경우
정렬이 수행되는 경우를 다음과 같이 간단하게 정리해보았습니다.
- 1) Merge JOIN
- 2) ORDER BY
- 3) GROUP BY
- 4) DISTINCT
- 5) UNION
- 6) RANKING WINDOWS FUNCTION
- 7) MIN MAX
위의 경우 중에서 예제를 통해 알아볼 것은
ORDER BY / GROUP BY / DISTINCT / UNION / RANKING WINDOWS FUNCTION 입니다.
3) 연산 과정에서의 정렬 알아보기
3 - 1) ORDER BY
SELECT *
FROM players
ORDER BY college;
위 쿼리의 연산 과정은 다음과 같습니다.

정렬에만 75%의 비용을 소모하고,
정렬을 하는 이유는 ORDER BY의 인자에 따라 데이터를 배치해야 하기 때문입니다.
3 - 2) GROUP BY
SELECT college, COUNT(college)
FROM players
WHERE college LIKE 'C%'
GROUP BY college;
위 쿼리의 경우 다음과 같이 연산합니다.

Sort에 8%의 비용을 사용하고,
정렬을 하는 이유는 집계하기 위함입니다.
3 - 3) DISTINCT
SELECT DISTINCT college
FROM players
WHERE college LIKE 'C%'
위 쿼리는 다음의 연산과정을 거칩니다.

sort하는데 8%의 비용을 소모하고,
sort하는 이유는 정렬하여 중복된 값을 없애기 위함입니다.
3 - 4) UNION
SELECT college
FROM players
WHERE college LIKE 'B%'
UNION
SELECT college
FROM players
WHERE college LIKE 'C%'
위의 쿼리는 다음의 연산과정을 수행합니다.

정렬하는데 2%의 비용을 차지하고,
DISTINCT 연산과 마찬가지로 중복을 제거하기 위해 sort를 수행합니다.
3 - 5) RANKING WINDOWS FUNCTION
SELECT ROW_NUMBER() OVER (ORDER BY college)
FROM players;
위 쿼리의 경우 다음의 연산과정을 수행합니다.

정렬하는데 있어서 75%의 비용을 소모하고,
정렬을 하는 이유는 GROUP BY와 동일한 집계를 위함입니다.
4) 정렬을 방지
정렬을 방지하는 방법은 결국, 쿼리의 수행 과정에서 정렬 절차를 생략하면 되는 일입니다.
이런 상황에서 쉽게 사용할 수 있는 것이 바로 INDEX입니다.
INDEX의 경우, 데이터 테이블에서 데이터들이 INDEX를 따라 정렬되므로
쿼리에서의 정렬 절차를 생략할 수 있습니다.
4 - 1) INDEX를 사용한 개선
-- INDEX를 인자로 ORDER BY를 사용하여 검색하는 경우
SELECT *
FROM batting
ORDER BY playerID, yearID;
쿼리의 연산과정은 다음과 같습니다.

이전과는 다르게 sort하는 과정이 생략되어 있음을 확인할 수 있습니다.
4 - 2) 다른 UNION 사용
기존의 UNION을 사용하는 쿼리 역시, 중복을 포함하여 수행하도록 연산을 바꿔줄 수 있습니다.
-- UNION의 경우도 중복을 제거하지 않고 전부 포함하여 수행하는 경우 sort하지 않는다
SELECT college
FROM players
WHERE college LIKE 'B%'
UNION ALL
SELECT college
FROM players
WHERE college LIKE 'C%'
쿼리의 수행과정은 다음과 같습니다.

이전의 사용과는 다르게 sort하는 과정이 사라졌습니다.
'대형 프로젝트 - C# + 유니티로 만드는 MMORPG 게임 개발 > (2) 데이터베이스' 카테고리의 다른 글
| SQL (29) - 쓰레드와 캐싱 (0) | 2025.03.03 |
|---|---|
| SQL (28) - 데이터 베이스의 원리 (0) | 2025.03.03 |
| SQL (26) - Hash JOIN (0) | 2025.02.26 |
| SQL (25) - Merge JOIN (0) | 2025.02.26 |
| SQL (24) - Nested Loop JOIN (0) | 2025.02.26 |