[Database] 실행계획 Join 종류

Posted by 신희준 on February 17, 2023


2023 - 02 - 17 (금)


Nested Loop Join

  • Driving 테이블에서 조회하고자 하는 대상의 행을 읽는다.

  • Driving 테이블에 조인이 걸린 첫번째 테이블부터 순서대로 조건에 맞는 행들을 검색한다.

      
    #예시1 - STUDENTID 는 STUDENT 테이블의 PK 이고 PK INDEX
    SELECT * 
      FROM STUDENT S, APPLICATION A 
      FROM S.STUDENTID = A.STUDENTID
       AND S.GRADE = 4
       AND A.APPLICATIONCODE = "MATH"
      
    
    • 위의 예시는 수강신청 목록 중 4학년 학생이 신청한 대상을 조회한다.

    • 이 경우 드라이빙 테이블은 APPLICATION 테이블이다

    • 먼저 수강신청코드가 수학인 APPLICATION 테이블의 ROW를 조회한다

    • 조회된 ROW를 LOOP 돌며 STUDENTID가 동일하고 GRADE가 4인 조건에 해당하는 경우 결과값에 결합한다.

      • 2중 for문을 보는 것과 같다.
      • Join 컬럼에 인덱스가 없는 경우 Full Scan을 하게된다. ex) STUDENT의 STUDENTID는 인덱스 설정이 되어있어야 함.

Sort Merge Join

  • 각각의 테이블을 검색 조건에 의하여 정렬한 후 조인 조건으로 값을 조인

  • 조인조건이 = 가 아니어도 가능하다 ( LIKE , BETWEEN 등등 )

  • 정렬이 끝난 후 연결(각각의 조인 테이블의 조건을 만족하는 ROW를 추출한 뒤 결합)

  • 대용량 테이블을 Sort Merge 할 경우 심각한 성능저하.. -> 각 테이블에 최대한 조건을 주어 범위를 줄인다.

  • Join 컬럼의 인덱스가 성능에 영향을 미치진 않는다.

      
    #예시2 - PK 삭제 
    SELECT /*+ use_merge(S A)*/  -- 힌트를 줌
      *  
      FROM STUDENT S, APPLICATION A 
      FROM S.STUDENTID = A.STUDENTID
       AND S.GRADE = 4
       AND A.APPLICATIONCODE = "MATH"
         
    

Hash Join

  • 기본적으로 cpu 메모리를 이용한다 부족시 디스크의 자원을 사용함.

  • 조인 조건이 = 이어야 함.

  • Join 컬럼의 인덱스가 성능에 영향을 미치진 않는다.

      
    #예시3
    SELECT /*+ use_hash(S A)*/  -- 힌트를 줌
      *  
      FROM STUDENT S, APPLICATION A 
      FROM S.STUDENTID = A.STUDENTID
       AND S.GRADE = 4
       AND A.APPLICATIONCODE = "MATH"