SQL/SQL 실무 활용

JOIN의 이해

별다방체리콕 2024. 1. 3. 13:00

 

 

 

 

 

NESTED LOOP JOIN의 개념

  • 옵티마이저가 Driving Table을 결정 (Outer Table)
  • Driving Table 이 아닌 테이블은 Driven Table로 지정 (Inner Table)
  • Driving Table의 각 row에 대해 이들이 추출될 때마다 Driven Table의 연관된 모든 row를 조인에 의해 액세스
  • 튜닝포인트
    • 테이블 간 조인 회수를 최소화 할 수 있도록 Driving Table을 결정
    • Driven Table의 연결고리 컬럼에 대한 인덱스 구성
  • Driving Table은 실행 계획에서 Driven Table 보다 위에 표시됨

 

 

 

 

 

 

 

 

 

NESTED LOOP JOIN의 절차

 

 

 

 

더보기

NESTED LOOP JOIN의 예

 

 

 

 

 

 

 

 

 

 

 

 

NESTED LOOP JOIN의 장단점

  • NESTED LOOP 조인은 인덱스에 의한 랜덤 액세스에 기반하고 있기 때문에 대량의 데이터 처리 시 적합하지 않음
  • Driving Table 로는 테이블의 데이터가 적은 마스터 테이블이거나, where 조건으로 적절하게 row를 제어할 수 있는 것이어야 함
  • Driven Table 에는 조인을 위한 적절한 인덱스가 생성되어 있어야 함
    → 연결 고리가 되는 칼럼은 사원번호, 주민번호와 같이 Unique 한 속성을 가진 칼럼 인덱스를 이용하거나
         분포도가 좋은 칼럼에 대한 인덱스를 이용할 수록 수행 속도는 좋아짐

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

NESTED LOOP JOIN 관련 파라미터

 

 

 

 

 

 

 

 

 

 

Drivig Table의 원리

 

 

 

 

 

더보기

DRIVING TABLE의 예

 

 

 

 

 

 

 

 

 

 

 

조인 순서 제어 방법

  • NESTED LOOP JOIN과 HASH JOIN은 조인 순서 제어가 매우 중요함
  • 조인 순서 제어 방법
    • 조인 순서 제어를 위한 힌트 사용
      • /* + ORDERD */
      • FROM 절에 기술한 테이블 순서대로 제어하기 위해 사용
      • /* + LEADING (테이블명) */
      • 힌트 내에 제시한 테이블이 드라이빙으로 채택됨
      • 단, ORDERED 힌트와 같이 사용할 경우 LEADING 힌트는 무시됨
  • 조인순서 제어를 위해 뷰의 절차성을 활용하는 방법
    • 인라인 뷰 사용
  • 외부적 변형을 사용하는 방법
  • FROM 절의 테이블 순서를 변경해서 제어하는 방법은 CBO 하에서는 의미가 없음

 

 

 

 

 

 

 

 

 

 

 

 

NL JOIN의 연결 고리 인덱스

 

 

 

 

 

 

 

 

 

 

 

SORT MERGE JOIN의 개념

  • SORT MERGE 조인의 사용
    • 연결 고리에 이상이 있는 경우
      1. 조인을 위한 연결 고리 컬럼에 대한 인덱스가 없는 경우
    • 대용량의 자료를 조인 처리함으로써 인덱스 사용에 의한 랜덤 액세스의 오버헤드가 많은 경우
  • SORT MERGE 조인에서는 Driving Table 이 의미 없음
  • 즉, 각 테이블에 대한 처리를 독립적으로 행함
  • 읽혀진 각 테이블의 데이터를 조인을 위한 연결고리 컬럼에 대하여 정렬
  • 정렬 후에 조인 작업이 수행 (MERGE)

 

 

 

 

 

 

 

 

 

 

SORT MERGE JOIN 절차

 

 

 

 

 

 

 

더보기

SORT MERGE JOIN 의 예

 

 

 

 

 

 

 

 

 

 

 

SORT MERGE JOIN의 장단점

  • SORT MERGE 조인은 조인 결합 조건으로 사용되는 연결고리 컬럼에 인덱스가 생성되어 있지 않은 경우에 빠른 조인을 위하여 사용
  • 조인 하고자 하는 각 테이블에 대해서 독립적으로 데이터를 읽어 들일 때, 이를 얼마나 빠르게 할 것 인지가 중요
  • 각 테이블로부터 읽혀진 데이터를 연결고리가 되는 컬럼에 대하여 정렬을 수행할 때 이를 얼마나 빠르게 할 것인지가 중요
  • Parallel Processing 을 함께 활용함으로 테이블에 대한 Full Table Scan의 속도를 향상시키는 것도 가능

 

 

 

 

 

 

 

 

 

 

 

 

SORT MERGE JOIN 파라미터

 

 

 

 

 

 

 

 

 

 

HASH JOIN의 개념

  • NESTED LOOP 조인과 SORT MERGE 조인에 의한 성능을 보다 개선하기 위해 사용
    → NESTED LOOP 조인은 인덱스 사용에 의한 랜덤 액세스의 오버헤드가 있으며,
        SORT MERGE 조인은 Sory operation 으로 인한 오버헤드가 있음
  • SORT MERGE 조인과 비교해 보면, 각 테이블에 대한 처리를 독립적으로 하는 것은 같지만 HASH JOIN 에서는 Driving Table이 있음 이는 HAST_AREA_SIZE 에 의해 결정되며 주로 작은 테이블이 DRIVING TABLE로 사용됨
  • 읽혀진 각 테이블의 데이터를 조인하기 위해서 Hash Algorithm 을 사용

 

 

 

 

 

 

 

 

 

HASH JOIN의 절차

 

 

 

 

 

 

 

 

 

 

더보기

HASH JOIN의 예

 

 

 

 

 

 

 

 

 

 

 

HASH JOIN의 장단점

  • CBO 모드에서 옵티마이저가 판단해서 적용할 수 있으며, 테이블의 통계 정보가 있어야 함
  • 통계 정보가 없는 경우에도 힌트를 사용하면 HASH JOIN을 사용하도록 유도할 수 있음
  • HASH 조인은 Equi 조인에서만 가능
  • Driving Table의 row를 조인하기 위한 연결고리에 대한 인덱스를 꼭 필요로 하지 않음
  • 방대한 처리 결과가 요구되는 OLTP 또는 DW 업무에서 사용됨
  • CPU와 메모리 등 많은 H/W 자원이 필요함

 

 

 

 

 

 

 

 

 

 

 

SET OPERATOR

 

 

 

 

 

더보기

SET 연산자의 예

 

 

 

 

 

 

 

 

 

 

 

 

SET 연산자의 장단점

  • 각 질의문 결과에 대한 수학적인 개념의 집합 연산 수행
  • UNION ALL 조회되는 Select List 의 칼럼 개수와 자료 형만 동일하다면 N 개의 질의문의 결과를 결합할 수 있는 수단
  • 교집합 (즉, 데이터 중복) 이 없는 경우, UNION ALL 사용
  • FIRST_ROWS 힌트 무시
  • 양방향 Outer 조인은 UNION 또는 UNION ALL 사용

 

 

 

 

 

 

 

 

SUBQUERY

 

 

 

 

 

 

 

 

 

 

 

 

CORRELATED SUBQUERY

 

 

 

 

 

 

 

 

 

 

 

TOP-N QUERY

  • TOP-N QUERY를 이용한 Top-N
    • Inline view 내에서의 order by 사용
    • Inline view로 부터 데이터 추출 시 ROWNUM 사용으로 데이터 row 수를 제어
    • ROWNUM 은 출력되는 rows 에 부여되는 순번임
  • Correlated Subquery 를 이용한 Top-N
    • Subquery 내부에서 Count(*)를 이용
  • Analytic Function 을 이용한 Top-N
    • RANS() OVER(), DENSE_RANK(), ROW_NUMBER()

 

 

 

 

 

 

 

 

 

 

 

 

 

'SQL > SQL 실무 활용' 카테고리의 다른 글

Table 변경/삭제  (0) 2024.01.04
Data 조작  (0) 2024.01.04
튜닝 활용  (0) 2024.01.03