오라클 옵티마이저 힌트 – 글로벌 힌트

옵티마이저 힌트를 통해 뷰(View) 내부의 실행 계획을 제어하고 싶을 때 사용합니다.

SELECT /*+ LEADING(X.E X.D) */ *
FROM  ( SELECT E.EMPNO, E.ENAME, D.DEPTNM
            FROM   EMP E, DPET D
            WHERE  E.DEPTNO = D.DEPTNO ) X

글로벌 힌트가 제대로 사용되려면 다음과 같은 조건을 만족해야 합니다.

  • 뷰 머징 쿼리 변환이 발생하지 않아야 함
  • 글로벌 힌트 내에 다른 쿼리 블록의 테이블을 사용하지 않아야 함

첫번째 조건으로 글로벌 힌트를 사용하려면 뷰머징을 하지 않도록 해야 합니다.

[잘못된 예]
SELECT /*+ MERGE(X) LEADING(X.E X.D) */ *
FROM  ( SELECT E.EMPNO, E.ENAME, D.DEPTNM
            FROM   EMP E, DPET D
            WHERE  E.DEPTNO = D.DEPTNO ) X
[올바른 예]
SELECT /*+ NO_MERGE(X) LEADING(X.E X.D) */ *
FROM  ( SELECT E.EMPNO, E.ENAME, D.DEPTNM
            FROM   EMP E, DPET D
            WHERE  E.DEPTNO = D.DEPTNO ) X

두번째 조건은 아래 예시를 보면 이해가 빠릅니다.

[잘못된 예]
SELECT /*+ LEADING(A B.X B.Y) */ 
          *
FROM   CUST A ,
         (SELECT *
           FROM  ORD X, ORD_DTL Y
           WHERE X.ORD_NO = Y.ORD_NO ) B
WHERE  A.CUST_NO = B.CUST_NO            
[올바른 예]
SELECT /*+ LEADING(A) LEADING(B.X B.Y) */ 
          *
FROM   CUST A ,
         (SELECT *
           FROM  ORD X, ORD_DTL Y
           WHERE X.ORD_NO = Y.ORD_NO ) B
WHERE  A.CUST_NO = B.CUST_NO           
위로 스크롤