분류 힌트 설명 최적화목표 ALL_ROWS 전체 처리속도 최적화 FIRST_ROWS (N) 최초 N건 응답속도 최적화 엑세스 방식 FULL Table Full Scan INDEX Index Scan INDEX_DESC Index 역순으로 scan INDEX_FFS Index Fast Full Scan INDEX_SS Index Skip Scan 조인 순서 ORDERED From 절에 나열된 순서로 조인 LEADING ( ) 괄호에 기술한 순서로 조인 SWAP_JOIN_INPUT 해시 조인 시, BUILD INPUT 명시적으로 선택 조인 방식 USE_NL NL 조인 USE_MERGE 소트 머지 조인 USE_HASH HASH 조인 NL_SJ NL 세미 조인 MERGE_SJ 소트 머지 세미 조인 HASH_SJ 해시 세미 조인 서브 쿼리 팩토링 MATERIALIZE WITH 문으로 정의한 집합을 물리적으로 생성
예) WITH /*MATERIALIZE*/ T AS (SELECT ···INLINE WITH 문으로 정의한 집합을 물리적으로 생성하지 않고 INLINE 처리
예) WITH /*INLINE*/ T AS (SELECT ···쿼리 변환 MERGE 뷰 머징 유도 NO_MERGE 뷰 머징 방지 UNNEST 서브쿼리 Unnesting 유도
서브쿼리를 풀어서 조인으로 변환NO_UNNEST 서브쿼리 Unnesting 방지 PUSH_PRED 조인조건 Pushdown 유도 NO_PUSH_PRED 조인조건 Pushdown 방지 USE_CONCAT OR 또는 IN-LIST 조건을 OR-Expansion으로 유도 NO_EXPAND OR 또는 IN-LIST 조건에 대한 OR-Expansion 방지 병렬 처리 PARALLEL 테이블 스캔 또는 DML을 병렬 처리하도록 유도 PARALLEL_INDEX 인덱스 스캔을 병렬 처리하도록 유도 PQ_DISTRIBUTE 병렬 수행 시 데이터 분배 방식 결정 기타 APPEND Direct-Path Insert 유도 DRIVING_SITE DB Link Remot 쿼리 최적화 및 실행 주체 지정 PUSH_SUBQ 서브쿼리를 가급적 빨리 필터링하도록 유도 NO_PUSH_SUBQ 서브쿼리를 가급적 늦게 필터링하도록 유도
해시 조인
1)Bulid Input을 읽어해시 테이블(해시 맵) 생성
2)Probe Input을 읽어 해시 테이블을 탑색하며 조인
일반적으로 더 작은 테이블을Bulid Input으로 사용하나,SWQP_JOIN_INPUT힌트를 사용해 명시적으로 바꿀 수 있다.
/*USE_HASH(a)*/ 와 비교
SWAP_JOIN_INPUT(a): 옵티마이저의 기본Build Input선택을 강제하는 것
USE_HASH(a): 특정 테이블(a)을Build Input으로 해시 조인을 사용하도록 강제 지정하는 것
→ 두 힌트 모두 특정 테이블(a)을Build Input으로 강제
→ 해시 조인을 사용하지 않았을 때,SWAP_JOIN_INPUT는 무시
SELECT /*+ PUSH_PRED */ * FROM ( SELECT employee_id, salary FROM employees WHERE `department_id = 10 AND ) emp WHERE salary > 5000;힌트를 사용하지 않는 경우
1) 서브 쿼리에서department_id = 10인 데이터 조회
2) 1)의 결과에서salary > 5000인 데이터 조회
힌트를 사용한 경우
department_id = 10 AND salary > 5000;인 데이터 조회
쿼리에서
OR또는IN조건을 포함할 때, OR 조건을 별도의 쿼리로 확장하여 실행하도록 유도한다. 이를OR-Expansion이라고 한다.
여러 조건을UNION ALL을 사용한 쿼리 조합으로 확장해 각 조건을 독립적으로 처리한다.
쿼리 예시 (OR조건) :SELECT /*+ USE_CONCAT */ * FROM employees WHERE department_id = 10 OR department_id = 20;쿼리 예시 (IN조건) :
SELECT /*+ USE_CONCAT */ * FROM employees WHERE department_id IN (10, 20);옵티마이저 변환 :
SELECT * FROM employees WHERE department_id = 10 UNION ALL SELECT * FROM employees WHERE department_id = 20;
SELECT문이 독립적으로 실행되므로, 조건 칼럼에 대해 각각인덱스를 사용할 수 있어 성능이 개선될 수 있다.