👉 따라서 "정렬이 언제 일어나는가?" 를 파악하고 줄이는 것이 중요하다.
| Case | 키워드 | 정렬 원인 | 인덱스로 회피 가능 여부 |
|---|---|---|---|
| 1 | Sort Merge Join | Merge 전에 정렬 필요 | O (클러스터드 인덱스) |
| 2 | ORDER BY | 지정된 컬럼 순으로 정렬 | O |
| 3 | GROUP BY | 집계 전 정렬로 그룹 구성 | O |
| 4 | DISTINCT | 중복 제거 위한 정렬 | X (조건에 따라 다름) |
| 5 | UNION | 중복 제거 위한 정렬 | O (UNION ALL) |
| 6 | Ranking Function | 순위 계산 시 정렬 필요 | O (인덱스 순서 활용 가능) |
| 7 | MIN, MAX | 정렬된 상태 필요 | O (인덱스 활용 시) |
SELECT *
FROM players
ORDER BY college;
Sort 연산 발생college 컬럼 기준 정렬college에 인덱스가 있을 경우 Sort 스킵 가능SELECT college, COUNT(college)
FROM players
WHERE college LIKE 'C%'
GROUP BY college;
Sort 발생college 인덱스 있을 경우 정렬 생략 가능SELECT DISTINCT college
FROM players
WHERE college LIKE 'C%';
Sort 발생-- 정렬 발생
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은 중복 제거 없음 → 정렬 생략 → 빠름SELECT ROW_NUMBER() OVER (ORDER BY college)
FROM players;
Sort 발생SELECT *
FROM batting
ORDER BY playerID, yearID;
batting 테이블의 인덱스를 활용하면 Sort 생략됨SELECT playerID, COUNT(playerID)
FROM players
WHERE playerID LIKE 'C%'
GROUP BY playerID;
playerID가 인덱스라면 Sort 없이 집계 가능