쿼리에 힌트를 부여하기 위해서는 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 plangSQL> 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 planHINT 를 사용시 HINT_ERROR 프로퍼티를 ON 으로 설정하여 HINT 구문이 잘못되었는지 확인할 수 있습니다.
gSQL> ALTER SESSION SET HINT_ERROR = ON; Session altered.
'Database > Goldilocks' 카테고리의 다른 글
| [GOLDILOCKS] 클라이언트 접속 방식 DA / CS / Dedicated / Shared 알아보기 (0) | 2018.05.24 |
|---|---|
| [GOLDILOCKS] 데이터베이스 관리 gmaster 프로세스 알아보기 (0) | 2018.05.24 |
| [GOLDILOCKS] 조인, Cross Join, Inner Join, Outer Join, Semi Join, Anti-Semi Join 알아보기 (0) | 2018.05.22 |
| [GOLDILOCKS] 쿼리 옵티마이저, 쿼리 최적화, QUERY OPTIMIZER 알아보기 (0) | 2018.05.22 |
| [GOLDILOCKS] SQL 함수 사용해보기 (0) | 2018.05.21 |