티스토리 뷰

반응형

아래 SQL에는 NO_MERGE, PUSH_PRED 힌트가 사용되었습니다.

먼저 PUSH_PRED 는 조인 조건 컬럼을 뷰안으로 병합하라고 조언해 주는 힌트입니다.

즉 인라인 뷰 v 의 조건절로 100 = v.manager_id(+) 조건이 들어가도록 변경한 다음에

실행계획을 수립하는 것입니다.

NO_MERGE는 메인쿼리와 인라인뷰가 합쳐지는 것 즉 병합을 하지말고 인라인 뷰 먼저 실행 하라는 것입니다.


SELECT /*+ NO_MERGE(v) PUSH_PRED(v) */ 

            *

FROM employees e,

(SELECT manager_id

FROM employees

) v

WHERE e.manager_id = v.manager_id(+)

AND e.employee_id = 100;


NO_MERGE는 아래와 같이 인라인 뷰가 먼저 실행되게 하고 싶을 때도 사용하고, 아래와 같을 때 함수를 한번만 호출하도록 

유도할때에도 사용되어 집니다.


/* FN_GetGbn() 호출이 DECODE 갯수만큼 더 실행 됨 */

SELECT  SUM(DECODE(GBN, 1, amt, null)) gbn1_amt

             ,SUM(DECODE(GBN, 2, amt, null)) gbn2_amt

             ,SUM(DECODE(GBN, 3, amt, null)) gbn3_amt

FROM

(

   SELECT AMT, FN_GetGbn(code)

   FROM 테이블

)


==> /* FN_GetGbn() 호출이 한번만 이루어 짐 */

SELECT  SUM(DECODE(GBN, 1, amt, null)) gbn1_amt

             ,SUM(DECODE(GBN, 2, amt, null)) gbn2_amt

             ,SUM(DECODE(GBN, 3, amt, null)) gbn3_amt

FROM

(

   SELECT /*+ NO_MERGE */ AMT, FN_GetGbn(code)

   FROM 테이블

)


======= EOF ================

반응형