ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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
Designed by Tistory.