HASH_AREA_SIZE & HASH_JOIN_ENABLED

  • CBO가 자원이 충분하고 Hash Join을 사용하는 게 더 좋다고 판단하면 Hash Join으로 풀림
    1. HASH_AREA_SIZE : Hash Join에서 사용되는 해쉬 메모리 크기의 기본 값은 sort_area_size 의 2배
      1. 정의 : hash join(7.3부터 사용)에 사용되는 최대 메모리 size 지정.
      2. 특징 : 9i 이상에서 값을 지정하는 것을 권장하지 않음. PGA_AGGREGATE_TARGET parameter 사용을 권장함

    2. HASH_JOIN_ENABLED
      1. 정의 : hash join 활성화 parameter
      2. 특징 : 10g에서 hidden parameter화 됨
      3. 기본값 : true
      4. 적용 방법
        • 시스템 레벨 적용 : init.ora 파일에 "HASH_JOIN_ENABLED = TRUE"
        • 세션 레벨 적용 : ALTER SESSION SET HASH_JOIN_ENABLED = TRUE
        • SQL문장 레벨 적용 : 힌트(use_hash) 사용
      5. DSS시스템에서는 매우 크게 지정하는 것이 바람직함(30MB)
           Cf) HASH_MULTIBLOCK_IO_COUNT : Hash Join시 한번에 I/O하는 블럭 수. Default는 DB_MULTIBLOCK_READ_COUNT의 값

  • Hash Join과 비교

SELECT S.a, B.a FROM S, B WHERE S.a = B.a;
‡ S : small table, B : big table
‡ analyze 를 수행하면 CBO 는 이미 S가 out table 이고 B 가 inner table이며 , S 를 driving table 로 인식

구분Sort merge join(SMJ)Nested loop join(NLJ)Hash join(HJ)
특징index 가 여러 level 의 depth 를 가질 때 merge 단계에 들어가기 위해 양쪽 table 이 모두 sortdriving table이 많은 row 의 data 를 갖는 경우 비효율적이 서 inner table 을 여러 번 probe(탐색)① HJ는 각 table 에 대해 1 번만 pass하므로 NLJ보다 효율적
② 작은 table 과 큰 table 의 join 시에 유리
③ Sort 수행하지 않으므로 SMJ보다 효율적
④ 주의점 : hash join 은 equi join 에서만 가능
COST① S 와 B 를 memory 에 읽어와 join key 로 각각 sort 후, join 수행
② Cost(SMJ) 는 Read(S) + Write(SortRuns(S)) + Read(B) + Write(SortRuns(B)) + Merge(S,B) + CPUSortCost(S + B) 에 비례
① S.a의 모든 column과 B.a 의 모든 column 을 match 후, rS* rB key 비교
② Cost(NLJ) 는 Read(S) + rS *Read(B) 에 비례
① 해시 메모리에서 수행됨
② Cost(HJ)는 Read(S) + Read(B) 에 비례(HJ 알고리즘에 의해서)

문서에 대하여

  • 최초작성자 : 박혜은
  • 최초작성일 : 2009년 11월 19일
  • 이 문서에 있는 테스트 결과는 DBMS버전과 구성된 환경에 따라 다를 수 있습니다.