[오라클] no_merge, push_pred 힌트에 대해서
아래 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 ================