쿼리에 힌트를 부여하기 위해서는 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.


블로그 이미지

사용자 꽁담