다음과 같이 주문 테이블(ORDER_MST), 주문 아이템 테이블 (ORDER_ITEM) 이 있다. 

1개의 주문에는 N개의 주문 아이템이 들어간다.(1:N 관계)


주문 테이블(ORDER_MST)은 상품번호(GOOD_ID)가 없으며 주문번호(ORD_NO)가 중복될수 없다.



주문번호 

 주문상태

 주문자

 1

 A1

 조현영

 2

 A1

 조현영

 3

 A2

 조현영




주문 아이템 테이블(ORDER_ITEM)에는 상품번호(GOOD_ID)가 기준이어 주문번호(ORD_NO)가 중복될수 있다.


주문번호 

 상품번호

 상품이름

 구매갯수

 주문날짜

1

 100

 우유

 1

190405 

1

 100

 사과

 3

190405

2

 100

 키위

 2

190405

3

 100

 우유

 3

190405




Q.    19년 4월 5일에 우유를 구매한 주문번호와 각 주문당 몇개의 우유를 구매하였는지 알아보려고 한다.


그러면 다음과 같이 쿼리를 작성할 수 있다.


1
2
3
4
5
6
7
8
9
10
SELECT A.ORD_NO     -- 주문번호
     , B.ORDER_DATE -- 주문날짜
     , B.GOOD_ID    -- 상품번호
     , B.ITEM_QTY   -- 갯수
  FROM ORDER_MST A
 INNER JOIN ORDER_ITEM B
    ON A.ORD_NO = B.ORD_NO
   AND A.ORDER_DATE >= '20190405'
   AND A.ORDER_DATE <= '20190405'   
   AND B.GOOD_ID = '10000'  -- 우유
cs



하지만 주문갯수가 1000개 이상 주문아이템도 10000개 이상으로 많다면 쿼리실행속도가 느려질수 있다.

이런경우 HINT를 사용하여 쿼리 실행속도를 개선시킬수 있다.



1
2
3
4
5
6
7
8
9
10
11
SELECT /*+ LEADING ( A ) USE_NL ( A B) */ 
       A.ORD_NO     -- 주문번호
     , B.ORDER_DATE -- 주문날짜
     , B.GOOD_ID    -- 상품번호
     , B.ITEM_QTY   -- 갯수
  FROM ORDER_MST A
 INNER JOIN ORDER_ITEM B
    ON A.ORD_NO = B.ORD_NO
   AND A.ORDER_DATE >= '20190405'
   AND A.ORDER_DATE <= '20190405'
   AND B.GOOD_ID = '10000'  -- 우유
cs



아래는 위 쿼리에 사용된 HINT 문장이다. 


1
/*+ LEADING ( A ) USE_NL ( A B) */ 
cs


LEADING은 join시에 가장 먼저 읽을 테이블을 선택하는 hint이다.

A 테이블을 먼저 읽어들이고 USE_NL(Use Nested Loop Join) 중첩 루프 조인이 일어나도록 하는 힌트 문장이다.  


주문 아이템(ORDER_ITEM) N의 데이터가 많아 

주문 마스터(ORDER_MST) 1을 먼저 읽어 

주문마스터와 주문아이템 테이블을 조인하겠다고 알려주는 것이다.



조인 순서를 알려주는 hint 문장 정리


- ORDERED

FROM절에 기술된 테이블 순서대로 조인을 수행하도록 유도한다.


- LEADING

FROM절에 기술한 테이블 순서와 상관없이 조인순서를 제어하는 힌트이다.


- USE_NL

중첩 루프 조인이 발생하게 하는 힌트이다.





+ Recent posts