Sorting

Jaemyeong Lee·2025년 3월 11일

🎑 왜 정렬이 위험할까?

  • 일반적으로 정렬 알고리즘의 시간복잡도는 O(N log N)
  • 그러나 DB에서 다루는 데이터의 양은 매우 크기 때문에, 메모리에 다 적재하지 못하면 디스크 접근이 발생
  • 디스크 접근은 메모리보다 수십 배 느리며, 성능 병목의 핵심 원인

👉 따라서 "정렬이 언제 일어나는가?" 를 파악하고 줄이는 것이 중요하다.


🎑 정렬(Sorting)이 발생하는 주요 상황 7가지

Case키워드정렬 원인인덱스로 회피 가능 여부
1Sort Merge JoinMerge 전에 정렬 필요O (클러스터드 인덱스)
2ORDER BY지정된 컬럼 순으로 정렬O
3GROUP BY집계 전 정렬로 그룹 구성O
4DISTINCT중복 제거 위한 정렬X (조건에 따라 다름)
5UNION중복 제거 위한 정렬O (UNION ALL)
6Ranking Function순위 계산 시 정렬 필요O (인덱스 순서 활용 가능)
7MIN, MAX정렬된 상태 필요O (인덱스 활용 시)

🎑 실습 예제와 분석

✅ 2) ORDER BY

SELECT *
FROM players
ORDER BY college;
  • 실행 계획: Sort 연산 발생
  • 원인: college 컬럼 기준 정렬
  • 해결: college에 인덱스가 있을 경우 Sort 스킵 가능

✅ 3) GROUP BY

SELECT college, COUNT(college)
FROM players
WHERE college LIKE 'C%'
GROUP BY college;
  • 실행 계획: Sort 발생
  • 해결: college 인덱스 있을 경우 정렬 생략 가능

✅ 4) DISTINCT

SELECT DISTINCT college
FROM players
WHERE college LIKE 'C%';
  • 실행 계획: Sort 발생
  • 원인: 중복 제거를 위해 정렬
  • 해결: 경우에 따라 필요 없으면 제거를 고려

✅ 5) UNION vs UNION ALL

-- 정렬 발생
SELECT college
FROM players
WHERE college LIKE 'B%'
UNION
SELECT college
FROM players
WHERE college LIKE 'C%';

-- 정렬 없음
SELECT college
FROM players
WHERE college LIKE 'B%'
UNION ALL
SELECT college
FROM players
WHERE college LIKE 'C%';
  • UNION은 내부적으로 DISTINCT 포함 → 정렬 발생
  • UNION ALL은 중복 제거 없음 → 정렬 생략 → 빠름

✅ 6) 윈도우 함수 (ROW_NUMBER)

SELECT ROW_NUMBER() OVER (ORDER BY college)
FROM players;
  • 실행 계획: Sort 발생
  • 이유: 정렬 순서대로 순위를 부여해야 하기 때문

🎑 인덱스를 활용한 정렬 제거 예제

✅ ORDER BY에서 인덱스 사용

SELECT *
FROM batting
ORDER BY playerID, yearID;
  • batting 테이블의 인덱스를 활용하면 Sort 생략됨

✅ GROUP BY에서 인덱스 사용

SELECT playerID, COUNT(playerID)
FROM players
WHERE playerID LIKE 'C%'
GROUP BY playerID;
  • playerID가 인덱스라면 Sort 없이 집계 가능

profile
李家네_공부방

0개의 댓글