사용자 도구

사이트 도구


study:oracle:datadb:4week_2:chap4

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판 이전 판
다음 판
이전 판
study:oracle:datadb:4week_2:chap4 [2010/05/26 17:23]
zummaz
study:oracle:datadb:4week_2:chap4 [2010/05/27 21:46] (현재)
zummaz
줄 1: 줄 1:
-====3.3.4. 조인 방법 선택용 힌트==== +======3.3.4. 조인 방법 선택용 힌트====== 
-조인방식을 선택하기위해 적용하는 힌트를 사용하는 것은 먼저 조인 방식에 대한 확실힌 이해가 바탕이 되야 한다. +  *앞서서 공부한 다양한 조인방식을 힌트(HINT)를 사용해 옵티마이져에게 권고(충고)할 수 있다. 
-부분범위 처리의 가능여부나, 인덱스의 구성상태처리범위나 사용빈도메모리의 가용상태와 작업영역(hash_area_size, sort_area_size 등)에 영향을 받는다 +  *조인방법은 다양한 주어진 상황에 영향을 받는. 다음과 같은 요소를 잘 검토해 HINT를 사용하도록 하자
-쿼리가 수행되는 시간대나 시스템의 유형(OLTP, OLAP등)에도 영향을 받을 수 있다.+    -부분범위 처리의 가능여부 
 +    - 인덱스의 구성상태 
 +    -  처리범위나 사용빈도 
 +    -  메모리의 가용상태 
 +    -  작업영역(hash_area_size, sort_area_size 등) 
 +      쿼리가 수행되는 시간대나 시스템의 유형(OLTP, OLAP등)
  
-===USE_NL=== +=====USE_NL===== 
-Nested Loops방식을 사용하여 조인을 수행하도록 유도하는 힌트이다 +  *Nested Loops방식을 사용하여 조인을 수행하도록 유도하는 힌트이다 
-이 힌트는 대상 집합 간의 조인 방식을 지칭할 뿐이며, 조인 순서에는 영향을 미치지 않는다.  +  *이 힌트는 대상 집합 간의 조인 방식을 지칭할 뿐이며, 조인 순서에는 영향을 미치지 않는다.  
- +  * 예\\ <code>SELECT /*+ USE_NL(a b c) */...
- 얘) SELECT /*+ USE_NL(a b c) */...+
        FROM TAB1 a, TAB2 b, TAB3 c        FROM TAB1 a, TAB2 b, TAB3 c
-       WHERE ...+       WHERE ...</code>
                
-===NO_USE_NL=== 
-USE_NL 힌트가 옵티마이져에게 지정한 테이블에 대한 조인 방식을 제시하는 것인데 반해, NO_USE_NL 힌트는 옵티마이져에게 지정한 테이블에 대해 Nested Loop 조인방식을 제외한 다른 방식의 조인-해쉬조인 이나 Sort Merge 조인등 -을 사용할을 제시한다. 옵티마이져의 실행계획 수립에 대해 USE_NL이 적극적인 개입이라면 NO_USE_NL은 소극적인 개입이라고 할 수 있다.  
-Nested Loops조인이 최적이라 판단되는 상황에서는 옵티마이져가 이 힌트를 무시할수도 있다. 
  
- 예) SELECT /*+ NO_USE_NL(l h) */.......+=====NO_USE_NL===== 
 +  *USE_NL 힌트가 옵티마이져에게 지정한 테이블에 대한 조인 방식을 제시하는 것인데 반해, NO_USE_NL 힌트는 옵티마이져에게 지정한 테이블에 대해 Nested Loop 조인방식을 제외한 다른 방식의 조인-해쉬조인 이나 Sort Merge 조인등 -을 사용할을 제시한다.  
 +  *옵티마이져의 실행계획 수립에 대해 USE_NL이 적극적인 개입이라면 NO_USE_NL은 소극적인 개입이라고 할 수 있다.  
 +  * **Nested Loops조인이 최적이라 판단되는 상황에서는 옵티마이져가 이 힌트를 무시**할수도 있다. 
 + 
 +  예) SELECT /*+ NO_USE_NL(l h) */.......
        FROM orders h, order_items l        FROM orders h, order_items l
        WHERE l.order_id, = h.order_id        WHERE l.order_id, = h.order_id
     AND l.order_date >= '20050101';     AND l.order_date >= '20050101';
  
-===USE_NL_WITH_INDEX=== 
-Nested Loops조인에서 선행처리되는 외측루프의 처리주관 인덱스를 지정할 때 사용하는 힌트이다. 과거에는 USE_NL 과 INDEX 힌트를 같이 사용하였지만 이 힌트는 이들을 하나로 통합한 것이다. 
  
- 예) SELECT /*+ USE_NL_WITH_INDEX(l item_prod_ix) */....+=====USE_NL_WITH_INDEX===== 
 +  *Nested Loops조인에서 선행처리되는 **외측루프의 처리주관 인덱스를 지정**할 때 사용하는 힌트이다.  
 +  *과거에는 **USE_NL 과 INDEX 힌트를 같이 사용하였지만 이 힌트는 이들을 하나로 통합**한 것이다. 
 + 
 +  예) SELECT /*+ USE_NL_WITH_INDEX(l item_prod_ix) */....
       FROM orders hm order_items l       FROM orders hm order_items l
       WHERE l.order_id = h.order_id       WHERE l.order_id = h.order_id
     AND l.order_item like 'ADEN%'     AND l.order_item like 'ADEN%'
     AND h.order_dt between '20051001' and '20051015';     AND h.order_dt between '20051001' and '20051015';
-만약 이 힌트에서 인덱스를 지정하지 않았다면, 내측 루프의 연결고리 인덱스가 정상이어야 외측루프(선행 테이블)의 어떤 인덱스가 처리주관 인덱스로 사용될 수 있다. 만약 특정 인덱스를 지정하였다면, 내측 루프의 연결고리가 정상일 때 지정한 인덱스가 적용될 수 있다.  
-참고: Nested Loops 조인에서 '연결고리 정상'에 대한 상세한 개념 [ 2.2 연결고리 상태가 조인에 미치는 영향(page 517~523)편] 
  
-===USE_HASH=== +  *만약 이 힌트에서 인덱스를 지정하지 않았면, 내측 루프의 연결고리 덱스가 정상이야 외측루프(선행 테이블)의 어떤 덱스가 처주관 덱스로 사용될 수 있다. 만약 특정 인덱스를 정하였다면, 내측 루프의 연고리가 상일 때 정한 인덱스가 적용될 수 있다.  
-해쉬조인 방식으로 조인이 수행되도록 우도하는 힌트. 해쉬조은 느 한쪽 테이블이작아서 -메모리 해쉬조로 수행될 수 있다면 매우 양호한 속도를 갖는다.  +  *참고: Nested Loops 조인에서 '연결고리 정상'에 대한 상세한 개념 [ 2.2 연고리 상태가 조인에 미치는 영향(page 517~523)편]
-대부분 경우는 옵티마이져가 통계를 토대로 빌드 입력과 검색입력을 결정하므로 일부러 'ordered'힌트를 주어 함부로 순서를 결정하는 것은 바람직하지 못하다. +
-그러나 옵티마이져의 판단에 문제가 있을 때나 라인뷰에서 가공한 결과 집합처럼 적절한 통계정보를 질 수 없는 경우에는 활용가치가 있다.+
  
- 예) SELECT /*+ USE_HASH (a b) */...+ 
 + 
 + 
 + 
 +=====USE_HASH===== 
 +  *해쉬조인 방식으로 조인이 수행되도록 우도하는 힌트이다.  
 +  *해쉬조인은 어느 한쪽 테이블이작아서 인-메모리 해쉬조인으로 수행될 수 있다면 매우 양호한 속도를 갖는다.  
 +    * **대부분 경우는 옵티마이져가 통계정보를 토대로 빌드 입력과 검색입력을 결정**하므로 일부러 'ordered'힌트를 주어 함부로 순서를 결정하는 것은 바람직하지 못하다. 그러나 옵티마이져의 판단에 문제가 있을 때나 인라인뷰에서 가공한 결과 집합처럼 적절한 통계정보를 가질 수 없는 경우에는 활용가치가 있다. 
 + 
 +  예) SELECT /*+ USE_HASH (a b) */...
        FROM sale a, pre_order b        FROM sale a, pre_order b
        WHERE a.order_id = b.order_id        WHERE a.order_id = b.order_id
     AND a.sale_dt LIKE '2005%';     AND a.sale_dt LIKE '2005%';
-이와 반대로 NO_USE_HASH 힌트는 옵티아미져가 지정하 테이블들을 조인하는 데 있어서 해쉬 조인을 제외한 다른 방식의 조인을 고려하도록 유도한다. 
  
- 예) SELECT /*+ NO_USE_HASH(m d) */....+  *이와 반대로 NO_USE_HASH 힌트는 옵티아미져가 지정하 테이블들을 조인하는 데 있어서 해쉬 조인을 제외한 다른 방식의 조인을 고려하도록 유도한다. 
 + 
 +  예) SELECT /*+ NO_USE_HASH(m d) */....
       FROM member m, dept d       FROM member m, dept d
       WHERE m.deptid = d.deptid;       WHERE m.deptid = d.deptid;
-===USE_MERGE=== 
-Sort Merge방식으로 조인을 수행하도록 유도하느 힌트이다. 필요하다면 'ordered'힌트와 같이 사용할 것을 추천한다. 
  
- 예) SELECT /*+ USE_MERGE(a b) */.......+ 
 + 
 +=====USE_MERGE===== 
 +  *Sort Merge방식으로 조인을 수행하도록 유도하느 힌트이다.  
 +  *필요하다면 'ordered'힌트와 같이 사용할 것을 추천한다. 
 + 
 +  예) SELECT /*+ USE_MERGE(a b) */.......
        FROM sale a, pre_order b        FROM sale a, pre_order b
        WHERE a.order_id = b.order_id        WHERE a.order_id = b.order_id
            AND a.sale_dt BETWEEN '20050701' AND '20050930'            AND a.sale_dt BETWEEN '20050701' AND '20050930'
            AND b.cust_no = '101';            AND b.cust_no = '101';
-이와는 반대로 NO_USE_MERGE 힌트는 옵티마이져가 지정한 테이블을 조인하는데 있어서 Sort Merge조인을 제외한 다른 방식의 조인을 고려하도록 유도한다. 
  
 +  *이와는 반대로 NO_USE_MERGE 힌트는 옵티마이져가 지정한 테이블을 조인하는데 있어서 Sort Merge조인을 제외한 다른 방식의 조인을 고려하도록 유도한다.
  
-==참조한문서==+ 
 +====참조한문서====
 "오라클클럽" http://wiki.oracleclub.com/pages/viewpage.action?pageId=1966259&  "오라클클럽" http://wiki.oracleclub.com/pages/viewpage.action?pageId=1966259& 
 +
 +
study/oracle/datadb/4week_2/chap4.1274862228.txt.gz · 마지막으로 수정됨: 2010/05/26 17:23 저자 zummaz