본문 바로가기

04번. IT 힌트얻기/▶ DB Tuning

[실행계획] Exercise_04


HASH JOIN

다르게 동시에 수행되는 특성과 스캔 방식이 아니라 연산에 의한 데이터 연결이라는 차이에 의해서 발생하는 것입니다. 적은 범위의 데이터라면 연결 고리와 선행 조건의 선택만 효율적으로 이루어진다면 NESTED LOOP JOIN이 유리하지만 반대의 경우나 데이터 양이 상당히 많은 경우 정렬 영역 사용에 문제가 있는 SORT MERGE JOIN 보다 HASH JOIN이 유리합니다. 일반적인 경우 OPTIMIZER 모두가 CHOOSE일 경우, NESTED LOOP JOIN인 실행계획의 가격이 불리할 때는 거의 100% HASH JOIND이 나오게 됩니다.

HASH JOIN 이 관계형 데이터베이스에서 비용이 가장 많은 JOIN 인 반면 정확히 적재 적소에 사용한다면 다른 어떤 JOIN 보다 성능이 뛰어납니다. 이러한 HASH JOIN은 일반적으로 OPTIMIZER 파라미터가 OPTIMIZER_GOAL = ALL_ROWS, CHOOSE인 경우 작은 테이블과 큰 테이블의 조인 시에 HASH JOIN 이 사용됩니다. 이러한 실행 여부는 옵티마이저의 자체적인 결정으로 사용자의 SQL에 쓰여진 테이블들의 구조 정보에 기반합니다. 이 때 유저가 원하는 것은 NESTED LOOP JOIN 일지라도 실제 오라클이 실행하는 방식은 HASH JOIN으로 실행될 수가 있으므로 주의가 필요합니다. 즉 OLTP 환경에서는 가급적 HASH JOIN 보다는 NESTED LOOP JOIN 방식이 낫다는 이야기입니다.
HASH JOIN의 수행 구조를 살펴보면 FROM 절에 나열된 테이블 중 작은 테이블을 메모리에 로드합니다.이 때 연결 고리에 나열된 컬럼 값을 메모리상에 HASH 함수를 통한 값으로 저장하게 됩니다. 그 후, 큰 테이블들을 여러 파티션으로 분리하여 메모리에 로드되어 있는 작은 테이블들의 값을 HASH 알고리즘을 통해 읽어오며 정렬하게 됩니다. 이 때 여러 파티션으로 나뉘어지는 테이블은 HASH_AREA_SIZE (SORT_AREA_SIZE의 2 배가 기본) 예 명시된 메모리에 상주되며 사이즈 초과시 DISK에 위치하게 됩니다. 이러한 처리작업으로 기인하여 NESTED LOOP 이나 SORT MERGE 방식보다 많은 CPU 자원과 메모리 자원이 필요하게 됩니다

'04번. IT 힌트얻기 > ▶ DB Tuning' 카테고리의 다른 글

[Tuning] CBO vs RBO  (0) 2011.10.10
[Tuning] SQL Trace  (0) 2011.10.10
[실행계획] Exercise_03  (0) 2011.10.06
[실행계획] Exercise_02  (0) 2011.10.06
[실행계획] Exercise_01  (0) 2011.10.06