[ORACLE] 서브쿼리(인라인뷰) 힌트 최상위 블럭에서 적용 하는 방법 - 글로벌힌트




    보통 서브쿼리나 인라인뷰에 힌트 적용 시 해당 블럭 부분에서 힌트를 적용합니다.
    단순한 힌트라면 괜찮지만 적용할 힌트가 많아 여기저기 적용하다보면 가독성이 떨어지는 경우가 있는데 깔끔하게 최상위 블럭에서 글로벌힌트로 적용하는 방법 입니다.

    인라인뷰에 힌트 추가

    T2에 대해서 FULL SCAN을 태우고 싶다면 인라인뷰 내에서 힌트를 추가한다
     
    select t1.c1, v.c2
    from t1,
      (select/*+ FULL(T2) */
        c1, c2
       from t2
       where c1 between 1 and 5) v
    where t1.c1 = v.c1
    ;
    ----------------------------------------------------------------------------
    | Id  | Operation          | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
    ----------------------------------------------------------------------------
    |   0 | SELECTSTATEMENT    |       |     1 |    39 |     2   (0)| 00:00:01 |
    |   1 |  NESTED LOOPS      |       |     1 |    39 |     2   (0)| 00:00:01 |
    |*  2 |   TABLE ACCESS FULL| T2    |     1 |    26 |     2   (0)| 00:00:01 |
    |*  3 |   INDEX RANGE SCAN | T1_N1 |     1 |    13 |     0   (0)| 00:00:01 |
    ----------------------------------------------------------------------------
    Predicate Information (identified byoperation id):
    ---------------------------------------------------
    2 - filter("C1">=1 AND "C1"<=5)
       3 - access("T1"."C1"="C1")
           filter("T1"."C1">=1 AND "T1"."C1"<=5)
    
    

    상위블럭에서 힌트 추가

    최상위에서 인라인뷰에 있는 t2테이블 힌트를 주면 적용 안고 인덱스 스캔이 발생함
     
    select/*+ full(t2) */
        t1.c1, v.c2
      from t1,
        (selectc1, c2
         from t2
         where c1 between 1 and 5) v
      where t1.c1 = v.c1
      ;       
    -------------------------------------------------------------------------------------
    | Id  | Operation                   | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
    -------------------------------------------------------------------------------------
    |   0 | SELECTSTATEMENT             |       |     1 |    39 |     0   (0)| 00:00:01 |
    |   1 |  TABLE ACCESS BYINDEX ROWID | T2    |     1 |    26 |     0   (0)| 00:00:01 |
    |   2 |   NESTED LOOPS              |       |     1 |    39 |     0   (0)| 00:00:01 |
    |*  3 |    INDEX RANGE SCAN         | T1_N1 |     1 |    13 |     0   (0)| 00:00:01 |
    |*  4 |    INDEX RANGE SCAN         | T2_N1 |     1 |       |     0   (0)| 00:00:01 |
    -------------------------------------------------------------------------------------
    Predicate Information (identified byoperation id):
    ---------------------------------------------------
    3 - access("T1"."C1">=1 AND "T1"."C1"<=5)
       4 - access("T1"."C1"="C1")
           filter("C1">=1 AND "C1"<=5)  
    
    

    글로벌힌트 사용

    글로벌힌트를 사용하여 해당 쿼리블럭에 힌트를 적용시킬 수 있음
     
      select/*+ full(v.t2) */
        t1.c1, v.c2
      from t1,
        (selectc1, c2
         from t2
         where c1 between 1 and 5) v
      where t1.c1 = v.c1
      ;       
    ----------------------------------------------------------------------------
    | Id  | Operation          | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
    ----------------------------------------------------------------------------
    |   0 | SELECTSTATEMENT    |       |     1 |    39 |     2   (0)| 00:00:01 |
    |   1 |  NESTED LOOPS      |       |     1 |    39 |     2   (0)| 00:00:01 |
    |*  2 |   TABLE ACCESS FULL| T2    |     1 |    26 |     2   (0)| 00:00:01 |
    |*  3 |   INDEX RANGE SCAN | T1_N1 |     1 |    13 |     0   (0)| 00:00:01 |
    ----------------------------------------------------------------------------
    Predicate Information (identified byoperation id):
    ---------------------------------------------------
    2 - filter("C1">=1 AND "C1"<=5)
       3 - access("T1"."C1"="C1")
           filter("T1"."C1">=1 AND "T1"."C1"<=5)
    
    

    Post a Comment

    다음 이전