다음과 같이 주문 테이블(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
중첩 루프 조인이 발생하게 하는 힌트이다.
'전체 > Oracle' 카테고리의 다른 글
ORA-28000: the account is locked 활성화 방법 (0) | 2019.07.08 |
---|---|
oracle USER 생성, 권한부여, table space 생성, export, import 방법 (1) | 2019.06.17 |
오라클 프로시저 만들기, 오라클 잡 등록하기 (0) | 2019.01.24 |
UNION, UNION ALL 차이점 (1) | 2017.11.23 |
ORACLE 임시테이블 생성, 컬럼 데이터 유형 바꾸기( ADD, MODIFY, RENAME, DROP ) (2) | 2017.11.22 |