힌트 | 분류 | 설명 | 예시 |
---|---|---|---|
ALL_ROWS | 최적화 목표 | 전체 결과 집합의 처리 속도 최적화 | SELECT /*+ ALL_ROWS */ * FROM employees; |
FIRST_ROWS(N) | 최적화 목표 | 초기 응답 시간 최소화 | SELECT /*+ FIRST_ROWS(10) */ * FROM employees; |
FULL | ACCESS 방식 | 테이블 전체를 스캔 (Full Table Scan) | SELECT /*+ FULL(emp) */ * FROM emp; |
INDEX | ACCESS 방식 | Index Scan으로 유도 | SELECT /*+ INDEX(emp emp_idx) */ * FROM emp WHERE deptno = 10; |
INDEX_DESC | ACCESS 방식 | Index를 역순으로 스캔하도록 유도 | SELECT /*+ INDEX_DESC(emp emp_idx) */ * FROM emp ORDER BY hiredate DESC; |
INDEX_FFS | ACCESS 방식 | Index Fast Full Scan으로 유도 Fast Full Scan: 인덱스를 전체 스캔하지만 정렬 없이 빠르게 | SELECT /*+ INDEX_FFS(emp emp_idx) */ * FROM emp; |
INDEX_SS | ACCESS 방식 | Index Skip Scan으로 유도 Skip Scan: 인덱스의 선두 컬럼이 조건에 없을 때 사용 | SELECT /*+ INDEX_SS(emp emp_composite_idx) */ * FROM emp WHERE job = ‘CLERK’; |
ORDERED | JOIN 순서 | FROM 절에 나열된 순서대로 조인 | SELECT /*+ ORDERED */ … FROM A, B, C WHERE …; |
LEADING | JOIN 순서 | LEADING 힌트 괄호에 기술한 순서대로 조인 (예) LEADING(T1 T2) | SELECT /*+ LEADING(A B C) */ … FROM A, B, C WHERE …; |
SWAP_JOIN_INPUTS | JOIN 순서 | 해시 조인 시, BUILD INPUT을 명시적으로 선택 (예) SWAP_JOIN_INPUTS(1) Nested Loop Join 시 내부/외부 테이블 순서를 바꿈 | SELECT /*+ SWAP_JOIN_INPUTS(B) */ … FROM A, B WHERE …; |
USE_NL | JOIN 방식 | Nested Loop Join 드라이빙 테이블의 각 행마다 대상 테이블을 반복적으로 조회 | SELECT /*+ USE_NL(dept) */ e.empno, e.ename, d.dname FROM emp e, dept d WHERE e.deptno = d.deptno; |
USE_MERGE | JOIN 방식 | Sort-Merge Join 두 테이블을 정렬 후 병합하여 조인 | SELECT /*+ USE_MERGE(dept) */ e.empno, e.ename, d.dname FROM emp e, dept d WHERE e.deptno = d.deptno; |
USE_HASH | JOIN 방식 | Hash Join 해시 테이블을 만들어 조인 수행 | SELECT /*+ USE_HASH(dept) */ e.empno, e.ename, d.dname FROM emp e, dept d WHERE e.deptno = d.deptno; |
NL_SJ | JOIN 방식 | Nested Loop Semi Join 서브쿼리 결과 중 첫 번째 매칭만 찾음 | SELECT /*+ NL_SJ(dept) */ e.empno, e.ename FROM emp e WHERE EXISTS ( SELECT /*+ NL_SJ(dept) */ 1 FROM dept d WHERE e.deptno = d.deptno ); |
MERGE SJ | JOIN 방식 | Merge Semi Join 정렬 후 병합 방식으로 Semi Join 수행 | SELECT /*+ MERGE_SJ(dept) */ e.empno, e.ename FROM emp e WHERE EXISTS ( SELECT /*+ MERGE_SJ(dept) */ 1 FROM dept d WHERE e.deptno = d.deptno ); |
HASH_SJ | JOIN 방식 | Hash Semi Join 해시 기반으로 Semi Join 수행 | SELECT /*+ HASH_SJ(dept) */ e.empno, e.ename FROM emp e WHERE EXISTS ( SELECT /*+ HASH_SJ(dept) */ 1 FROM dept d WHERE e.deptno = d.deptno ); |
MATERIALIZE | 서브 쿼리 팩토링 | WITH 문으로 정의한 집합을 물리적으로 생성하도록 유도 예) WITH /*+ MATERIALIZE */ T AS ( SELECT ···) | SELECT /*+ INLINE */ * FROM ( SELECT deptno, COUNT(*) AS emp_count FROM emp GROUP BY deptno ) v, dept d WHERE v.deptno = d.deptno; |
INLINE | 서브 쿼리 팩토링 | WITH 문으로 정의한 집합을 물리적으로 생성하지 않고 INLINE 처리하도록 유도 예) WITH /*+ INLINE */ T AS (SELECT ···) | SELECT /*+ INLINE */ * FROM ( SELECT deptno, COUNT(*) AS emp_count FROM emp GROUP BY deptno ) v, dept d WHERE v.deptno = d.deptno; |
MERGE | 쿼리 변환 | 뷰 머징 유도 | SELECT /*+ MERGE(v) */ * FROM ( SELECT deptno, COUNT(*) AS cnt FROM emp GROUP BY deptno ) v, dept d WHERE v.deptno = d.deptno; |
NO_MERGE | 쿼리 변환 | 뷰 머징 방지 | SELECT /*+ NO_MERGE(v) */ * FROM ( SELECT deptno, COUNT(*) AS cnt FROM emp GROUP BY deptno ) v, dept d WHERE v.deptno = d.deptno; |
UNNEST | 쿼리 변환 | 서브쿼리 Unnesting 유도 (서브쿼리를 풀어서 조인으로 변환) | SELECT /*+ UNNEST */ * FROM emp WHERE empno IN (SELECT empno FROM bonus); |
NO_UNNEST | 쿼리 변환 | 서브쿼리 Unnesting 방지 | SELECT /*+ NO_UNNEST */ * FROM emp WHERE empno IN (SELECT empno FROM bonus); |
PUSH_PRED | 쿼리 변환 | 조인조건 Pushdown 유도 | SELECT /*+ PUSH_PRED(v) */ * FROM ( SELECT * FROM emp ) v WHERE v.deptno = 10; |
NO_PUSH_PRED | 쿼리 변환 | 조인조건 Pushdown 방지 | SELECT /*+ NO_PUSH_PRED(v) */ * FROM ( SELECT * FROM emp ) v WHERE v.deptno = 10; |
USE_CONCAT | 쿼리 변환 | OR 또는 IN-List 조건을 OR-Expansion으로 유도 | SELECT /*+ USE_CONCAT */ * FROM emp WHERE job = ‘CLERK’ OR job = ‘MANAGER’; |
NO_EXPAND | 쿼리 변환 | OR 또는 IN-List 조건에 대한 OR-Expansion 방지 | SELECT /*+ NO_EXPAND */ * FROM emp WHERE job = ‘CLERK’ OR job = ‘MANAGER’; |
PARALLEL | 병렬 처리 | 테이블 스캔 또는 DML을 병렬방식으로 처리하도록 유도 예) PARALLEL (T12) PARALLEL(T22) | SELECT /*+ PARALLEL(emp 4) */ * FROM emp WHERE sal > 3000; |
PARALLEL_INDEX | 병렬 처리 | 인덱스 스캔을 병렬방식으로 처리하도록 유도 | SELECT /*+ PARALLEL_INDEX(emp emp_sal_idx) */ * FROM emp WHERE sal > 3000; |
PQ_DISTRIBUTE | 병렬 처리 | 병렬 수행 시 데이터 분배 방식 결정 outer_method, inner_method는 HASH, BROADCAST, NONE 중 선택 예) PQ_DISTRIBUTE(T1 HASH HASH) | SELECT /*+ PARALLEL(emp) PARALLEL(dept) PQ_DISTRIBUTE(emp HASH HASH) */ * FROM emp JOIN dept ON emp.deptno = dept.deptno; |
APPEND | 기타 | Direct-Path Insert 로 유도 | INSERT /*+ APPEND */ INTO emp_archive SELECT * FROM emp WHERE hiredate < TO_DATE(‘2000-01-01’, ‘YYYY-MM-DD’); |
DRIVING_SITE | 기타 | DB Link Remote 쿼리에 대한 최적화 및 실행 주체 지정 (Local 또는 Remote) | SELECT /*+ DRIVING_SITE(remote_emp) */ * FROM emp e, remote_emp@remote_db r WHERE e.empno = r.empno; |
PUSH_SUBQ | 기타 | 서브쿼리를 가급적 빨리 필터링하도록 유도 | SELECT /*+ PUSH_SUBQ */ * FROM emp WHERE deptno IN (SELECT deptno FROM dept WHERE loc = ‘DALLAS’); |
NO_PUSH_SUBQ | 기타 | 서브쿼리를 가급적 늦게 필터링하도록 유도 | SELECT /*+ NO_PUSH_SUBQ */ * FROM emp WHERE deptno IN (SELECT deptno FROM dept WHERE loc = ‘DALLAS’); |
오라클 주요 힌트 목록
