행위

해시 조인 HASH

DB CAFE

(USE HASH 힌트에서 넘어옴)
thumb_up 추천메뉴 바로가기


1 HASH 조인(HASH JOIN)[편집]

해시 함수를 이용하여 조직 테이블(데이터 작은쪽)에 해시테이블을 만들고 실적집계 테이블(데이터 많은쪽)을 탐색하면서 조인.

SQL_361.jpg

c20c_ja2.gif

  • Hash Join에서는 작은 테이블을 먼저 접근하는 것이 성능이 좋음(해시테이블을 빨리 build 하기때문).
  이후 큰 테이블을 접근하여 해시 함수를 사용해서 순차적으로 해시 테이블로 탐색 한다.    
  • 대량 데이터를 처리하는 배치성 프로그램에 적합한 조인 방식.

2 HASH 조인의 특징[편집]

  • Hash Join 성능을 좌우하는 두 가지 포인트
  • 한 쪽 테이블이 가용 메모리에 담길 정도로 충분히 작아야 함
  • Build Input 해시 키 칼럼에 중복 값이 거의 없어야 함 (조인컬럼의 값이 중복이 많을 수록 해시키 충돌에 의해 성능은 저하된다.)
  • Inner루프로 Hash Area에 생성해둔 해시테이블을 이용한다는 것 외에 NL조인과 유사하다.
  • 해시테이블 만들 때(Build Input)는 전체범위처리가 불가피하나, Probe Input을 스캔하는 단계는 부분범위 처리가능하다.
  • 해시조인은 해시테이블이 PGA영역에 할당 되므로, NL조인보다 빠르다.
  • NL조인은 Outer테이블에서 읽히는 레코드마다 Inner쪽 테이블 버퍼캐시 탐색을 위해 래치획득을 반복하나, 해시조인은 래치 획득과정없이 PGA에서 빠르게 데이터를 탐색할 수 있다.

2.1 HASH 조인 장점[편집]

  • NL조인처럼 조인시 발생하는 Random엑세스 부하가 없다.
  • 소트머지조인처럼 조인전에 양쪽 집합을 정렬해야 하는 부담이 없다.

2.2 HASH 조인 단점[편집]

  • 해시테이블을 생성하는 비용이 수반
  • Build Input이 작을 때 효과적이다.(PGA에 할당되는 Hash Area에 담길정도로 충분히 작아야 함)
  • 해시키 값으로 사용되는 컬럼에 중복값이 거의 없을 경우 효과적이다.(중복값이 많을수록 성능이 저하된다.)

2.3 HASH 조인을 고려해야 할때[편집]

  • 조인 칼럼에 적당한 인덱스가 없어 NL Join이 비효율적일 때
  • 조인 칼럼에 인덱스가 있더라도 NL Join 드라이빙 집합에서 Inner 쪽 집합으로의 조인 액세스량이 많아 Random 액세스 부하가 심할 때
  • Sort Merge Join 하기에는 두 테이블이 너무 커 소트 부하가 심할 때
  • 수행빈도가 낮고 조인할 때

3 HASH JOIN 예시[편집]

SELECT /*+ USE_HASH(B) */
       A.조직명,A.조직코드,SUM(B.실적),...
  FROM 조직 A
     , 실적집계 B
 WHERE A.조직코드 = B.조직코드.  -- hash 함수를 사용 하여 해시키 생성 후 조인
   AND A.사업부   = 'ㅇ사업부서명'. -- index를 사용 하여 성능 개선
   AND B.집계년월 = '201908'  -- index를 사용 하여 성능 개선     
 GROUP BY A.조직명,A.조직코드

(설명)

1. 조직 테이블(A)에서 사업부가 ‘ㅇ사업부서명’조회 후, 조인 컬럼인 조직코드를 해시 함수로 분류한 다음, 해시테이블 을 생성. (Build Input , 해시 함수를 이용해 해시 테이블 구성)

2. 실적집계 테이블(B) 에서 집계년월이 ‘201908’를 조회 후, 조인 컬럼인 조직코드를 해시 함수로 변환 후 해시 테이블로 순차 적으로 접근한다. (Probe Input 해시 함수를 통하여 해시 테이블을 탐색)

  • 조회 조건 컬럼인 A.사업부 컬럼과 B.집계년월 컬럼의 인덱스를 사용하여 성능을 개선하고 ,
  • 조인 컬럼인 A.조직코드 = B.조직코드는 인덱스가 존재하더라도 사용되지 않는다.



USE_HASH 조인