Merge 조인은 다음과 같은 특징을 가진다:
SELECT *
FROM players AS p
INNER JOIN salaries AS s
ON p.playerID = s.playerID;
Clustered Index ScanSortMerge Join정렬 → 병합의 개념을 이해하기 위해 C# 코드로 먼저 직관적인 Merge Join을 구현해보자.
class Player : IComparable<Player>
{
public int playerId;
public int CompareTo(Player other) => playerId.CompareTo(other.playerId);
}
class Salary : IComparable<Salary>
{
public int playerId;
public int CompareTo(Salary other) => playerId.CompareTo(other.playerId);
}
List<Player> players = new List<Player> { new(0), new(9), new(1), new(3), new(4) };
List<Salary> salaries = new List<Salary> { new(0), new(5), new(0), new(2), new(9) };
players.Sort(); // O(n log n)
salaries.Sort(); // O(m log m)
int p = 0, s = 0;
List<int> result = new List<int>();
while (p < players.Count && s < salaries.Count)
{
if (players[p].playerId == salaries[s].playerId)
{
result.Add(players[p].playerId);
s++;
}
else if (players[p].playerId < salaries[s].playerId)
p++;
else
s++;
}
players = [0, 0, 0, 0, 0]
salaries = [0, 0, 0, 0, 0]
SET STATISTICS TIME ON;
SET STATISTICS IO ON;
SET STATISTICS PROFILE ON;
SELECT *
FROM players AS p
INNER JOIN salaries AS s
ON p.playerID = s.playerID;
players: PK가 lahmanID에 있음salaries: 복합 PK (year, teamID, lgID, playerID)playerID에는 정렬된 인덱스 없음 → Sort 필요SELECT *
FROM schools AS s
INNER JOIN schoolsplayers AS p
ON s.schoolID = p.schoolID;
Clustered Index가 정렬된 상태라서 정렬 단계 SKIP