JOIN과 성능

K·2022년 6월 14일
0

SQL BOOSTER

목록 보기
7/12

1. 조인의 내부적인 처리 방식

1.1 조인의 3가지 처리 방식

  • 조인방법 : 이너조인, 아우터 조인, 카테시안 조인
  • NESTED LOOPS JOIN
  • MERGE JOIN
  • HASH JOIN
  • 3가지 방식과 조인방법을 혼합하여 사용가능

1.2 NESTED LOOP JOIN

  • 간단하게 NL조인이라 부른다.
  • 중첩 반복문형태 (중첩 FOR문)
  • USE_NL힌트사용
  • NL후행테이블의 인덱스는 매우중요, 필요한부분에 인덱스를 정확히만들어준다면 가장 적은 비용으로 빠르게 결과를 얻을수있다.
  • 많은양의 데이터를 조인하기에는 한계가있는 조인

1.3 MERGE JOIN

  • 두 데이터 집합을 연결조건값으로 정렬한 후 조인을 처리하는 방식
  • USE_MERGE힌트사용
  • Operation - SORT JOIN단계는 자신의 자식단계의 결과를 조인하기위해 정렬하는 작업
  • 소트(정렬) 작업을 어떻게 줄이느냐가 성능향상의 주요 포인트

1.4 HASH JOIN

  • 조인성능문제 대부분이 해시조인으로 해결되는경우가 많음
  • 다른방식보다 더많은 CPU와 메모리자원 사용 > NL조인으로 충분히 해결할수있는문제를 모두 해시조인으로 처리하면 시스템 전반적으로 성능문제 발생할수있음.
  • USE_HASH힌트사용
  • HASH 조인 처리과정 간소화 이미지
  • NL처럼 후행집합 반복접근 비효율 없고, 머지조인처럼 정렬작업을 수행하지도않는다.
    다만 고비용 해시함수와 메모리 일부인 해시영역을 사용하는 비용이 추가투입.
  • NL, 머지조인 단점을 커버하지만, 시스템 자원 소모하는 단점.

2. NL조인과 성능

  • NL조인은 후행테이블쪽 조인조건 컬럼에 인덱스가 필수 > 없다면 후행테이블 풀스캔하게됨
  • 조인컬럼에 인덱스가없다면 인라인뷰를 통해 건수를 줄여주는게 좋다.
  • Predicate Information에서 access처리되는지 확인 필요
  • 쿼리변형(Query Transformation) : 조건에 따라 SQL이 자동변형되는경우도있음.
    • SQL의 변형이 실행결과에 전혀 영향이 없다.
    • 선행집함에따라 변형이 성능이 더 좋은경우.
  • 조인 횟수를 줄이는 시도
    • 선행집합변경 : 건수가 적은 테이블을 선행테이블로

      A테이블:60건 B테이블:12000건일경우
      B - A 조인은 A에 12000번접근
      A - B조인은 B에 60번만접근

    • 후행집합 접근횟수를 줄이려면 선행집합 건수가 작아야한다.
    • COUNT를통해 건수확인후 조인을 구성해보자.
  • 여러테이블 조인
    • 건수확인, 조인방법 결정, 인덱스 유무 체크
    • 특정 SQL 성능 개선을 위한 과도한 튜닝(인덱스 남발등)은 오히려 시스템 전반적 성능에 문제가생길수 있다.
  • 선행집합이 항상 작은쪽이어야 할 필요는없다.
    후행집합에서 인덱스로 읽을 데이터가 너무많을 경우는 FULL SCAN하여 선행으로 옮기는것이 더 효율적일 수 있다.

3. MERGE조인과 성능

3.1 대량의 데이터 처리

  • MERGE 조인은 대량의 데이터 조인시 적합

3.2 필요한 인덱스

  • 조인대상 테이블 각가의 WHERE조건에 각각의 인덱스를 구성해주면된다.
  • 각인덱스는 TABLE ACCESS FULL보다 좋은 성능이라야한다.
  • 정렬작업(SORT JOIN)을 제거할 수 있는 인덱스를 구성하는것도 좋은 전략

4. HASH조인과 성능

4.1 대량의 데이터 처리

  • NL, 머지조인의 단점해결 BUT 시스템 자원소모가큼
  • 빌드입력(선행집합)의 선택이 매우 중요
  • 검증입력(Probe-Input)은 후행입력 : 후행집합에 해시함수를 적용해 빌드입력과 비교해 조인을 처리하는 과정
  • 해시조인은 빌드입력이 데이터가 적을수록 성능에 유리
  • 빌드입력의 데이터가 너무많아 해시영역에 올릴 수 없으면 임시공간을 사용하게되며 이로 인해 성능저하 발생.
  • 소량의 데이터 조인에도 매우 유용

어떻게조인할것인가

  • 조인순서 인덱스를 다양하게바꿔보고 NL, 머지, 해시등을 다양하게 구사해본다.
profile
늙어가면서 기억을 남기는 개발자

0개의 댓글