대용량오라클힌트(hint)
오라클 대용량 자료 조회 튜닝 - 해쉬조인(HASH JOIN)
대량의 데이터를 테이블 조인하여 자료를 조회 할 때 속도의 이슈가 발생한다.
몇십만에서 몇억건의 데이터를 조회 할 때 발생했었으며, 2개에서 3개 테이블을 조인했을 때 발생했다.
제가 했던 업무는 일종의 대상 추출.
TEMP 테이블 2~3개를 조인했을 때 심각한 속도저하가 발생하였다.
이를 해결 하기 위해 선택한 방법이다.
1. Hash Join 의 장단점
대용량의 데이터였기 때문에 Hash Join을 이용했다.
Nestes Loop 조인 시 발생하는 Random 엑세스의 부하가 없으며,
Sort Merge 조인 전에 양쪽을 정렬해야 하는 부담이 없다.
특히 해시조인은 인덱스 존재유무에 영향을 받지 않으며,
해시키 값으로 사용되는 컬럼에 중복값이 거의 없을 경우 효과적이다.
물론 단점도 있다.
해시테이블을 생성하는 비용이 수반된다는 점이다.
2. Hash 조인을 활용한 튜닝
1) Build Input 조정
해시조인은 작은집합 Build Input 을 읽어 해시맵을 생성하고 큰 집합인 Probe Input 을 스캔한다.
따라서 해쉬 조인을 위해 작은집합의 테이블을 Build Input 으로 지정해야 한다.
(Build Input의 해시키값에 중복이 많을 때는 매우 비효율적이 된다.)
힌트를 사용할 때 /*+ USE_HASH(테이블D 테이블E ) */ 중 D 가 Build Input 이고 E 가 Probe Input 이다.
2) Parallel 을 활용한 성능 향상
Parallel 힌트를 활용하면 대용량 데이터를 처리할 때 더 좋은 성능을 기대할 수 있습니다.
하지만 시스템 자원을 많이 쓰기 때문에 신중히 고려해야 합니다.
/*+ PARALLEL(테이블 DEGREE수) */
/*+ USE_HASH(테이블D 테이블E ) PARALLEL(테이블D DEGREE수) PARALLEL(테이블E DEGREE수) */
병렬프로세스 개수를 지정해야 하며, 하지 않을 경우 디폴트로 기동됨으로 지정하는 것이 좋습니다.
여기서 DEGREE 는 병렬도를 말하는 것으로 CPU 의 코어보다 적은 수여야 합니다.
3) Hash 조인
/*+ USE_HASH(테이블D 테이블E ) PARALLEL(테이블D DEGREE수) PARALLEL(테이블E DEGREE수) */
/*+ USE_HASH(테이블D 테이블E ) */
위 HINT 를 사용할 수 있으며, 나는 PARALLEL 을 활용하지 않고 HASH 힌트만으로 충분한 성능향상을 보았다.
3. Hash 조인시 유의사항
해시테이블은 조인이 끝나면 소멸하는 구조이기 때문에 수행빈도가 높은 쿼리는 CPU와 메모리 사용률을
증가시킬 수 있다. 따라서 시스템에 부하가 발행한다.
따라서 수행빈도가 낮고, 쿼리 수행이 오래 걸리는 대용량의 테이블 조인시 사용하는 것이 적합하다.