티스토리 뷰
ORDERED와 LEADING은 테이블 간 접근 순서를 결정하는 힌트절이지만 USE_NL, USE_HASH는 테이블 간 접근 방법을 결정하는 힌트절이다. 이러한 힌트절을 통해 오라클 조인 방식을 상황에 맞게 선택해 사용할 수 있다.
오라클의 조인 방식에는 Nested Loop Join, Hash Join, Sort Merge Join 3가지가 있지만, 이중에서 Sort Merge Join은 사용되는 경우가 거의 없다. 개발자가 가장 많이 접하는 조인 방식은 Nested Loop Join이다. 이는 순차적인 루프에 의한 테이블 간 접근 방식이며, 온라인성(OLTP) 쿼리에 많이 사용된다. Hash Join은 해시 함수를 이용한 테이블 간 접근 방식으로, 배치성(Batch) 쿼리에 많이 사용된다.
위 그림의 USE_NL 힌트절에 의한 Nested Loop Join 처리 과정은 다음과 같다.
1. 고객 테이블에서 고객명이 ‘홍길동’인 고객을 구한다. (선행 테이블 결정)
2. ‘홍길동’ 고객의 수 만큼 순차적으로 주문 테이블을 고객번호 컬럼으로 접근한다. (순차적 접근)
3. 주문 테이블에서 주문일자가 ‘20141201’인 정보만 필터한다.
즉, 고객 테이블에서 주문 테이블로 순차적으로 접근하겠다는 의미이다. 진행 방향인 1번 컬럼과 3번 컬럼엔 인덱스가 반드시 존재해야 한다.
위 그림의 USE_HASH 힌트절에 의한 Hash Join 처리 과정은 다음과 같다.
1. 조직 테이블에서 사업부가 ‘강원사업부’인 조직들을 구한 후, 조인절 컬럼인 조직코드를 해시 함수로 분류한 다음, 해시테이블을 생성한다. (해시 함수를 이용해 해시 테이블을 구성)
2. 집계 테이블에서 집계년월이 ‘201412’인 자료를 구한 후, 조인절 컬럼인 조직코드를 해시 함수로 변환 후 해시 테이블로 순차적으로 접근한다. (해시 함수를 통하여 해시 테이블을 탐색)
즉, 해시 함수를 이용하여 조직 테이블과 집계 테이블을 조인하겠다는 의미이다.
조회 조건 컬럼인 1번, 4번 컬럼의 인덱스는 사용되고 있으며, 조인 컬럼인 2번, 3번 컬럼에는 인덱스가 존재하더라도 사용되지는 않는다.
Hash Join에서는 작은 테이블을 먼저 접근하는 것이 성능 면에서 더 좋다. 해시 테이블 구성 작업에 부하가 많이 발생하기 때문이다. 작은 테이블을 접근하여 해시 함수를 사용해서 해시 테이블을 생성하며, 이후 큰 테이블을 접근하여 해시 함수를 사용해서 순차적으로 해시 테이블로 접근한다. 이러한 조인 방식은 대량 데이터를 처리하는 배치성 프로그램에 적합한 조인 방식이다.
위 그림에 대한 힌트절
/*+ LEADING(가 라 다 마 바 나) USE_HASH(라) USE_NL(다 마 바 나) */
'데이터베이스 > SQL 튜닝' 카테고리의 다른 글
힌트의 종류별 분류 (0) | 2018.06.21 |
---|---|
배치 튜닝에서 마법사 같은 힌트절 삼총사 ? USE_HASH, FULL, PARALLEL (0) | 2018.05.24 |
자원 사용을 결정하는 힌트절? INDEX, FULL, PARALLEL (0) | 2018.05.23 |
접근 순서를 결정하는 힌트절 ? ORDERED, LEADING (0) | 2018.05.18 |
힌트절이란 무엇인가 ? (0) | 2018.05.17 |