TheBest

블로그 이미지
단군의 후예이길 거부하는자 .. 꺼져주시길
by InsertCoin

TAG CLOUD

  • Total hit
  • Today hit
  • Yesterday hit

Hash Join은 테이블의 조인 시 특정 테이블 하나(크기가 작은 테이블)를 메모리로 로드 후 Hash 기법을 이용하여 조건에 맞는 데이터를 추출하는 로우(ROW) 연산 또는 집합(SET) 연산 입니다.

일반적으로 Hash Join이 Merge Join 보다 성능이 우수하므로 힌트(USE_HASH)를 이용하여 인위적으로 해시 조인이 일어나도록 하는 것이 유리 합니다.

SQL문 사용시 인위적으로 Hash Join이 일어나게 하기 위해서는 USE_HASH 라는 힌트를 사용하면 되는데 힌트를 사용하지 않더라도 Join시 두 테이블 중 한 테이블이 상당히 작아 메모리에 로드 될만한 공간이 있다면 Hsah Join이 일어나는 실행 계획을 만들어 낼 수 있습니다.

SQL> SELECT /*+ ORDERED USE_HASH(DEPT, EMP) */
               EMP.ENAME,
               EMP.SAL,
               DEPT.DNAME
      FROM   DEPT, EMP
      WHERE DEPT.DEPTNO = EMP.DEPTNO;

Execution Plan
-----------------------------------------------------------
0         SELECT STATEMENT Optimizer=CHOOSE(Cost=5 Card=80 Bytes=8888)
1        0  HASH JOIN(Cost=5 Card=80 Bytes=8888)
2        1     TABLE ACCESS (FULL) OF ‘DEPT’ (Cost=1 Card=67 Bytes=3456)
3        1     TABLE ACCESS (FULL) OF ‘EMP’  (Cost=1 Card=90 Bytes=8756)


위 실행계획에서 DEPT 테이블이 위쪽에 위치하는데 보통 작은 테이블이 위에 위치할 때 좋은 성능을 낼 수 있습니다. 즉 DEPT 테이블이 메모리에 로드 되면 Oracle은 해싱 함수를 이용하여 EMP 테이블의 ROW들을 메모리에 로드 되어 있는 값과 비교하여 원하는 데이터를 추출 하며 이때 FROM절 뒤의 테이블 순서와 USE_HASH 힌트에 나오는 테이블의 순서는 같아야 합니다.

일반적으로 USE_HASH 힌트는 ORDERED 힌트와 같이 사용되는데 이때는 USE_HASH 인수로 두번째 테이블명(Alias 명)만을 적어도 됩니다. 즉 아래처럼 말입니다.

/*+ ORDERED USE_HASH(DEPT) */

Hash Join의 성능에 영향을 주는 파라미터는 HASH_AREA_SIZE와 HAHS_MULTIBLOCK_IO_COUNT가 있으며 첫번째 파라미터는 해시 조인 시 해시 테이블을 생성하기 위해 사용 가능한 메모리의 사이즈 이며 두번째 파라미터는 한번의 I/O로 해시 조인 시 쓰거나 읽을 수 있는 블록의 수입니다.(9i 이상에서는 HASH_MULTIBLOCK_IO_COUNT 파라미터는 더 이상 사용되지 않습니다.)
AND

ARTICLE CATEGORY

분류 전체보기 (131)
공지사항 (2)
JAVA (1)
ORACLE (12)
기타 (15)
JSP (1)
flash (7)
자존심의이유 (36)
secret (0)
좋은글 모음 (34)
UNIX (2)
민가 (21)

RECENT ARTICLE

RECENT COMMENT

RECENT TRACKBACK

CALENDAR

«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

ARCHIVE

LINK