◆ 힌트 종류 조회
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'
;