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