-
Merge데이터베이스 with MSSQL/SQL 튜닝 2022. 4. 19. 14:26
1. Merge로직
1) NL조인처럼 외부 테이블과 내부 테이블이 있다고 했을 때, 우선 두 테이블을 정렬한다.
2) 외부 테이블은 중복된 값이 없는 것이 좋고 내부 테이블은 중복된 값이 있어도 상관없다.
- 외부 테이블에 중복된 값이 없고 내부 테이블에 중복된 값이 있다 = One To Many, 시간복잡도 (N + M)
- 외부 테이블에 중복된 값이 있고 내부 테이블에도 중복된 값이 있다 = Many To Many, 시간복잡도(N * M)
3) 외부 테이블과 내부 테이블에서 서칭을 하는 도중 똑같은 값을 만나면 중복이 허용되는 내부 테이블 쪽의 커서를 1 증가시킨다.
4) 커서가 두 테이블의 끝에 다다르기 전까지 비교해보면서 같은 값을 찾는다.2. 로직확인
SELECT * FROM players AS p INNER JOIN salaries AS s ON p.playerID = s.playerID;
결과는 Many To Many가 뜸
One To Many를 위해서 Merge Join도 조건이 붙는다.
조건은 외부 테이블의 조인이 유일성을 가져야한다. => Primary Key, 제약조건 Unique
일일이 Random Access -> Clustered Scan 후 정렬SELECT * FROM schools AS s INNER JOIN schoolsplayers as p ON s.schoolID = p.schoolID;
결과는 One To Many가 뜸.
schools는 schoolD 인덱스가 정렬되어 있어서 정렬 과정이 생략된 것을 볼 수 있음.
결론.
1) Merge->Sort Merger로 기억하면 편하다.
2) 양쪽 집합을 sort(정렬)하고 Merge(병합)한다.
3) 이미 정렬된 상태라면 Sort는 생략 (특히, Clustered로 물리적으로 정렬된 상태라면 Best)
4) 정렬할 데이터가 너무 많으면 성능이 떨어진다. -> Hash사용
- Random Access위주로 수행되진 않는다.
- Many-to-Many(다대다)보다는 One-to-Manu(일대다) 조인에 효과적
5) PK, UNIQUE제약조건을 사용하면 좋다.'데이터베이스 with MSSQL > SQL 튜닝' 카테고리의 다른 글
Sorting (0) 2022.04.19 Hash (0) 2022.04.19 Nested Loop 조인 (0) 2022.04.18 복합 인덱스 컬럼 순서 (0) 2022.04.15 북마크 룩업 (0) 2022.04.15