ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [GOLDILOCKS] SQL 쿼리 HINT 사용해보기
    Goldilocks DBMS/실습하기 2018.05.22 14:15

    쿼리에 힌트를 부여하기 위해서는 SELECT 와 컬럼 사이에 /*+ HINT */ 를 작성해야 합니다.


    GOLDILOCKS 힌트는 5가지로 구분됩니다.

    - Access Path Hints

    - Join Order Hints

    - Join Operation Hints

    - Query Transformation Hints

    - Other Hints



     대분류

     힌트명과 사용법

     설명

     Access Path

     FULL (table_name)

     테이블을 전체 스캔

     

     INDEX( table_name [ , ] [ index_name [ [ , ] index_name ] ] )

     기술한 테이블에 대한 인덱스 스캔

     

     NO_INDEX( table_name [ , ] [ index_name [ [ , ] index_name ] ] )

     기술한 테이블에 대한 인덱스 비스캔

     

     INDEX_ASC( table_name [ , ] [ index_name [ [ , ] index_name ] ] )

     기술한 테이블에 대한 인덱스 오름차순 수행

     

     INDEX_DESC( table_name [ , ] [ index_name [ [ , ] index_name ] ] )

     기술한 테이블에 대한 인덱스 내림차순 수행

     

     INDEX_COMBINE( table_name [ , ] [ index_name [ [ , ] index_name ] ] )

     기술한 테이블에 대해 OR 구문을 분리하여 각각 인덱스 스캔 수행 후 결과를 합침

     

     ROWID( table_name )

     기술한 테이블에 대해 ROWID 스캔

     Join Order

     ORDERED

     FROM 절에 기술한 테이블 순서대로 조인 수행

     

     ORDERING( table_name [ LEFT | RIGHT ] [ , table_name [ LEFT | RIGHT ] ]

     기술한 순서대로 테이블 조인 수행

     위치 지정이 가능하며 LEFT 는 outer node 를, RIGHT 는 inner node 를 의미

      LEADING( table_name [ [ , ] table_name ] ) 기술한 순서대로 테이블 조인 수행
     Join Operation USE_HASH( table_name [ [ , ] table_name ] ) HASH JOIN 기법을 사용하여 조인 수행
      NO_USE_HASH( table_name [ [ , ] table_name ] )

     HASH JOIN 기법이 아닌 다른 기법으로 조인 수행

      USE_MERGE( table_name [ [ , ] table_name ] )

     MERGE JOIN 기법을 사용하여 조인 수행

      NO_USE_MERGE( table_name [ [ , ] table_name ] )

     MERGE JOIN 기법이 아닌 다른 기법으로 조인 수행

      USE_NL( table_name [ [ , ] table_name ] ) NESTED LOOPS JOIN 기법을 사용하여 조인 수행
      NO_USE_NL( table_name [ [ , ] table_name ] ) NESTED LOOPS JOIN 기법이 아닌 다른 기법으로 조인 수행
      USE_INL( table_name [ [ , ] table_name ] ) SORT INSTANT 를 이용한 NESTED LOOPS JOIN 기법을 사용하여 조인 수행
      NO_USE_INL( table_name [ [ , ] table_name ] )

     SORT INSTANT 를 이용한 NESTED LOOPS JOIN 기법이 아닌 다른 기법으로 조인 수행

     Query
     Transformation
     UNNEST

     SubQuery 에 대하여 동일한 결과를 보장하는 구문으로 변경하여 처리

      NO_UNNEST

     SubQuery 에 대하여 Unnest 를 하지 않고 Filter 로 처리

      NL_SJ

     SubQuery 에 대하여 Nested Loops Semi Join 으로 처리

      NL_ISJ SubQuery 에 대하여 Nested Loops Inverted Semi Join 으로 처리
      MERGE_SJ SubQuery 에 대하여 Merge Semo Join 으로 처리
      HASH_SJ

     SubQuery 에 대하여 Hash Semi Join 으로 처리

      HASH_ISJ

     SubQuery 에 대하여 Hash Inverted Semi Join 으로 처리

      HASH_AJ

     SubQuery 에 대하여 Hash Anti-Semi Join 으로 처리

      TRANSITIVE_CLOSURE 
      NO_TRANSITIVE_CLOSURE 
      MERGE( view_name )

     기술한 View 가 Merging 이 가능하면 적용

      NO_MERGE( view_name ) 기술한 View 가 Merging 이 가능하더라도 적용하지 않음
      NO_QUERY_TRANSFORMATION Query 에 대하여 어떤 변형도 하지 않음

     Other

     PUSH_PRED

     단일 테이블에 대하여 적용이 가능한 Filter 를 Push

     

     NO_PUSH_PRED

     단일 테이블에 대하여 적용이 가능한 Filter 를 Push 하지 않음
     

     PUSH_SUBQ

     SubQuery 에 대하여 적용이 가능한 최하위 노드까지 Push
     

     NO_PUSH_SUBQ

     SubQuery 에 대하여 적용이 가능한 최하위 노드까지 Push 하지 않음

      USE_GROUP_HASH

     GROUP BY 절이 있는 경우 HASH INSTANT 를 사용

     

     USE_DISTINCT_HASH

     DISTINCT 절이 있는 경우 HASH INSTANT 를 사용



    하나의 예로 LEADING HINT 를 사용하여 Join 순서를 변경해보겠습니다.

    LEADING 에 기술한 테이블의 순서에 따라, ACCESS 순서가 변경되는 것을 확인할 수 있습니다.

    gSQL> explain plan
        2 SELECT /*+ LEADING(T1, T2) */ T1.C1 FROM T1, T2 WHERE T1.C1 = 1 AND ROWNUM = 1;
    
    C1
    --
     1
    
    1 row selected.
    
    >>>  start print plan
    
    < Execution Plan >
    ===================================================================================================
    |  IDX  |  NODE DESCRIPTION                                             |                    ROWS |
    ---------------------------------------------------------------------------------------------------
    |    0  |  SELECT STATEMENT                                             |                         |
    |    1  |    COUNT                                                      |                       1 |
    |    2  |      NESTED LOOP JOIN (INNER JOIN)                            |                      20 |
    |    3  |        INDEX ACCESS ("T1", "T1_PRIMARY_KEY_INDEX") [CLONED]   | (         1)          1 |
    |    4  |        INDEX ACCESS ("T2", "T2_PRIMARY_KEY_INDEX") [CLONED]   | (        20)         20 |
    ===================================================================================================
    
         1  -  STOP KEY FILTER : ROWNUM = 1
         2  -  JOINED COLUMNS : T1.C1
         3  -  READ INDEX COLUMNS : C1
                 MIN RANGE : C1 = 1
                 MAX RANGE : C1 = 1
         4  -  READ INDEX COLUMNS : NOTHING
    
    <<<  end print plan
    gSQL> explain plan
        2 SELECT /*+ LEADING(T2, T1) */ T1.C1 FROM T1, T2 WHERE T1.C1 = 1 AND ROWNUM = 1;
    
    C1
    --
     1
    
    1 row selected.
    
    >>>  start print plan
    
    < Execution Plan >
    ===================================================================================================
    |  IDX  |  NODE DESCRIPTION                                             |                    ROWS |
    ---------------------------------------------------------------------------------------------------
    |    0  |  SELECT STATEMENT                                             |                         |
    |    1  |    COUNT                                                      |                       1 |
    |    2  |      NESTED LOOP JOIN (INNER JOIN)                            |                      20 |
    |    3  |        INDEX ACCESS ("T2", "T2_PRIMARY_KEY_INDEX") [CLONED]   | (        20)         20 |
    |    4  |        INDEX ACCESS ("T1", "T1_PRIMARY_KEY_INDEX") [CLONED]   | (         1)          1 |
    ===================================================================================================
    
         1  -  STOP KEY FILTER : ROWNUM = 1
         2  -  JOINED COLUMNS : T1.C1
         3  -  READ INDEX COLUMNS : NOTHING
         4  -  READ INDEX COLUMNS : C1
                 MIN RANGE : C1 = 1
                 MAX RANGE : C1 = 1
    
    <<<  end print plan



    HINT 를 사용시 HINT_ERROR 프로퍼티를 ON 으로 설정하여 HINT 구문이 잘못되었는지 확인할 수 있습니다.

    gSQL> ALTER SESSION SET HINT_ERROR = ON;
    
    Session altered.


    댓글 0

Designed by Tistory.