◆ 힌트 종류 조회

SELECT * FROM V$SQL_HINT;

 

◆ INDEX Access Operation 관련 HINT
HINT                    내용                                                    사용법
INDEX                   INDEX를 순차적으로 스캔                                 INDEX(TABLE_name, INDEX_name)
INDEX_ASC               INDEX를 내림차순으로스캔.
INDEX_DESC              INDEX를 오름차순으로 스캔.                              INDEX_DESC(TABLE_name, INDEX_name)
INDEX_FFS               INDEX FAST FULL SCAN                                    INDEX_FFS(TABLE_name, INDEX_name)
PARALLEL_INDEX          INDEX PARALLEL SCAN                                     PARALLEL_INDEX(TABLE_name, INDEX_name)
NOPARALLEL_INDEX        INDEX PARALLEL SCAN 제한                                NOPARALLEL_INDEX(TABLE_name, INDEX_name)
AND_EQUALS              여러개의 INDEX MARGE 수행                               AND_EQUALS(INDEX_name, INDEX_name)
FULL                    FULL SCAN지정된 테이블에 대한 전체 스캔.                FULL(TABLE_name)


◆ JOIN Access Operator 관련 HINT
HINT                    내용                                                    사용법
USE_NL                  NESTED LOOP JOIN                                        USE_NL(TABLE1, TABLE2)
                        옵티마이저가 NESTED LOOP JOIN을 사용하도록 한다.
                        먼저 특정 TABLE의 ROW에 액세스하고 
                        그 값에 해당하는 다른 TABLE의 ROW를 찾는 작업을 
                        해당범위까지 실행하는 조인.

USE_NL_WITH_INDEX       INDEX를 사용해서 NESTED LOOP JOIN을 사용하도록 한다.    USE_NL_WITH_INDEX(TABLE INDEX)  NESTED LOOP 조인에서 외측 루프의 처리주관 인덱스를 지정할때 사용
USE_MERGE               SORT MERGE JOIN                                         USE_MERGE(TABLE1, TABLE2)
                        옵티마이저가 SORT MERGE JOIN을 사용하도록 한다.
                        먼저 각각의 TABLE의 처리 범위를 스캔하여 SORT한 후, 
                        서로 MERGE하면서 JOIN하는 방식.
USE_HASH                HASH JOIN 옵티마이저가 HASH JOIN을 사용하도록 한다.     USE_HASH(TABLE1, TABLE2)
HASH_AJ                 HASH ANTIJOIN                                           HASH_AJ(TABLE1, TABLE2)
HASH_SJ                 HASH SEMIJOIN                                           HASH_SJ(TABLE1, TABLE2)
NL_AJ                   NESTED LOOP ANTIJOIN                                    NL_AJ(TABLE1, TABLE2)
NL_SJ                   NESTED LOOP SEMIJOIN                                    NL_SJ(TABLE1, TABLE2)
MERGE_AJ                SORT MERGE ANTIJOIN                                     MERGE_AJ(TABLE1, TABLE2)
MERGE_SJ                SORT MERGE SEMIJOIN                                     MERGE_SJ(TABLE1, TABLE2)



◆ JOIN시 DRIVING 순서 결정 HINT
HINT                    내용                                                    사용법
ORDERED                 FROM절에 명시된 테이블의 순서대로 DRIVING               
LEADING                 파라미터에 명시된 테이블의 순서대로 JOIN                LEAING(TABLE_name1, TABLE_name2, ...)
DRIVING                 해당 테이블을 먼저 DRIVING                              DRIVING(TABLE)



◆ 기타 HINT
HINT                    내용                                                    사용법
APPEND                  INSERT시 DIRECT LOADING
PARALLEL                SELECT, INSERT시 여러개의 프로세스로 수행               PARALLEL(TABLE, 개수)
CACHE                   데이터를 메모리에 CACHING
NOCACHE                 데이터를 메모리에 CACHING하지 않음
PUSH_SUBQ               SUBQUERY를 먼저 수행
UNNEST                  SUBQUERY가 풀려 메인쿼리에 JOIN으로 수행
NO_UNNEST               SUBQUERY가 풀리지않도록 수행, /*+ NO_UNNEST PUSH_SUBQ */ 이런식으로 WHERE절의 SUBQUERY가 먼저수행되어 메인쿼리의 범위를 줄일수 있을때 사용한다.
REWRITE                 QUERY REWRITE 수행
NOREWIRTE               QUERY REWRITE를 수행 못함
USE_CONCAT              IN절을 CONCATENATION ACCESS OPERATION으로 수행, OR(IN)연산자를 별도의 실행단위로 분리, 각각의 최적 엑세스경로를 수립후 연결(union)하여 실행계획 유도, 사용에 유의.
USE_EXPAND              IN절을 CONCATENATION ACCESS OPERATION으로 수행못하게 함
MERGE                   VIEW MERGING 수행
NO_MERGE                VIEW MERGING 수행못하게 함

 


예)

SELECT  /*+ LEADING(INFO PODT POHD) USE_NL_WITH_INDEX(PODT IDX_ESPPODT_08) USE_NL_WITH_INDEX(POHD ESPPOHD_IE2) */
        INFO.*
,       PODT.*
,       POHD.*
FROM ESPINFO INFO
JOIN ESPPODT PODT ON  PODT.SYS_ID   = INFO.SYS_ID
                  AND PODT.COMP_CD  = INFO.COMP_CD
                  AND PODT.PLT_CD   = INFO.PLT_CD
                  AND PODT.VD_CD    = INFO.VD_CD
                  AND PODT.ITEM_CD  = INFO.ITEM_CD
                  
JOIN ESPPOHD POHD ON  POHD.SYS_ID   = PODT.SYS_ID
                  AND POHD.COMP_CD  = PODT.COMP_CD
                  AND POHD.PO_NO    = PODT.PO_NO
                  AND POHD.PO_CRE_DATE BETWEEN INFO.APPLY_SD AND INFO.APPLY_ED

WHERE INFO.SYS_ID   = 'AP'
  AND INFO.COMP_CD  = '1100'
  AND DECODE(INFO.PRICE_TYP, NULL, '02', '01') = '01'
  AND INFO.STS      <> 'D'
  
  AND POHD.STS <> 'D'
  AND PODT.STS <> 'D'
;